日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

c++ 2D小球 碰撞模拟

發(fā)布時(shí)間:2024/8/1 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ 2D小球 碰撞模拟 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一個(gè)簡(jiǎn)單的2D小球碰撞模擬程序,代碼不長(zhǎng)主程序90多行。

全部用c++實(shí)現(xiàn),借助easyx繪圖,同時(shí)實(shí)現(xiàn)簡(jiǎn)單向量類(lèi)便于計(jì)算 (默認(rèn)小球質(zhì)量相同 大小相同)。

#include <iostream> #include <easyx.h> #include <conio.h> #include <algorithm> #include <vector> #include <cmath> #include <stdlib.h> #include <time.h> #include "Vector2D.h"//2D向量頭 #include "CollisionBox.h"//只有一個(gè)球 using namespace std; const int WIDTH = 1100; const int HEIGHT = 600;void CollisionCheck(vector<Ball> &v) { //碰撞檢測(cè)/****************為簡(jiǎn)化模型 視小球?yàn)? “一動(dòng)一靜” ********************************/for (int i = 0; i < v.size(); i++) {for (int j = i + 1; j < v.size(); j++) {if (pow(v[i].x - v[j].x, 2) + pow(v[i].y - v[j].y, 2) <= 4.0 * v[i].r*v[i].r) {Vector2D vv(v[i].vx - v[j].vx, v[i].vy - v[j].vy); //和速度向量Vector2D v1, v2; //小球1速度向量、小球2速度向量/*****************根據(jù)兩球坐標(biāo)計(jì)算兩球碰撞球心連線的向量(方向)**********************/Vector2D t1(v[i].x, v[i].y), t2(v[j].x, v[j].y);v2 = t2 - t1;double angle = Angle(vv, v2); //得到球心連線與和速度夾角double k = Len(vv)*cos(Rad(angle)) / Len(v2);v2.x *= k; //得到小球2的速度向量v2.y *= k;v1 = vv - v2; //計(jì)算得到小球1的速度向量/******************至此已經(jīng)計(jì)算出碰撞后兩小球的相對(duì)運(yùn)動(dòng)狀態(tài)*************************/v[i].vx = v1.x + v[j].vx; //再加上之前的速度是因?yàn)橛?jì)算過(guò)程是將一個(gè)球看做靜態(tài)來(lái)計(jì)算的v[i].vy = v1.y + v[j].vy;v[j].vx += v2.x;v[j].vy += v2.y;}}} } void WallCheck(vector<Ball> &v) {for (int i = 0; i < v.size(); i++) {if (v[i].x + v[i].r >= WIDTH) v[i].vx *= -1; //右壁else if (v[i].y - v[i].r <= 0) v[i].vy *= -1; //上壁else if (v[i].x - v[i].r <= 0) v[i].vx *= -1; //左壁else if (v[i].y + v[i].r >= HEIGHT) v[i].vy *= -1; //下壁} } void CreatBall(vector<Ball> &v) {srand((unsigned int)time(NULL));for (int i = 0; i < 10; i++) { //隨機(jī)生成10個(gè)小球double x, y, r = 20, vx, vy;bool f = 1;while (f) {f = 0;x = (rand() % (WIDTH - 2 * (int)r))*1.0 + r;y = (rand() % (HEIGHT - 2 * (int)r))*1.0 + r;for (int j = 0; j < v.size(); j++) { //要保證生成的位置不重疊if (pow(v[j].x - x, 2) + pow(v[j].y - y, 2) <= 4.0 * pow(v[j].r, 2)) {f = 1;}}if (!f) {vx = rand() % 6; //速度太快會(huì)粘到一起......汗vy = rand() % 6;Ball t(x, y, r, vx, vy);v.push_back(t);}}} } int main() {initgraph(WIDTH, HEIGHT);vector<Ball> v;CreatBall(v);while (1) {BeginBatchDraw();for (int i = 0; i < v.size(); i++) solidcircle(v[i].x, v[i].y, v[i].r);CollisionCheck(v);WallCheck(v);for (int i = 0; i <= 10000000; i++); //適當(dāng)延時(shí)EndBatchDraw();cleardevice();for (int i = 0; i < v.size(); i++) {v[i].x += v[i].vx;v[i].y += v[i].vy;}}closegraph();return 0; }

頭文件:
Vector2D.h

#pragma once #include<cmath> const double PI = 3.1415926; //轉(zhuǎn)角度 double Deg(double rad) { return rad * 180.0 / PI; } //轉(zhuǎn)弧度 double Rad(double deg) { return deg / 180.0 * PI; } /*2D向量頭*/ struct Vector2D {Vector2D() :x(), y() {};Vector2D(double px, double py) :x(px), y(py) {};double x, y;Vector2D operator + (const Vector2D &b)const {//減法return Vector2D(this->x + b.x, this->y + b.y);}Vector2D operator - (const Vector2D &b)const {//加法return Vector2D(this->x - b.x, this->y - b.y);}Vector2D operator () (double px, double py) {this->x = px, this->y = py;return *this;}double operator * (const Vector2D &b)const {//向量?jī)?nèi)積return (this->x * b.x + this->y * b.y);} };double Len(const Vector2D &a) {//向量的模return sqrt(a.x*a.x + a.y*a.y); } double Angle(const Vector2D &a, const Vector2D &b) {//兩個(gè)向量夾角return Deg(acos(a*b / (Len(a)*Len(b)))); }

CollisionBox.h

#pragma once struct Ball {double x, y, r;double vx, vy; //x、y軸的的方向向量Ball() :x(), y(), r(), vx(), vy() {}Ball(double sx, double sy, double sr = 30.0, double svx = 3.0, double svy = 0.0):x(sx), y(sy), r(sr), vx(svx), vy(svy) {} };

總結(jié)

以上是生活随笔為你收集整理的c++ 2D小球 碰撞模拟的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产人妖ts重口系列网站观看 | 亚洲国产一二三区 | 欧美性受xxxx黑人xyx性 | 亚洲偷 | 综合久久久 | 99色播| 天天色天天干天天 | аⅴ资源中文在线天堂 | fc2ppv在线观看 | 自拍视频在线播放 | 久久久成人精品 | 中文字幕视频一区二区 | 亚洲欧美激情图片 | 久久人人爽人人爽人人片av免费 | 国产伦理在线观看 | 免费一级淫片 | 三区在线观看 | 三区在线视频 | 顶级毛片| 先锋资源中文字幕 | hd丰满圆润的女人hd | 欧美人妻精品一区二区 | 综合网中文字幕 | 91久久久久久久久 | 99riav国产| 日韩av.com| 亚洲天堂精品一区 | 我要看免费毛片 | 国产精品日| 涩天堂| 看黄网站在线 | 国产亚洲色婷婷久久 | 成人影音在线 | 男人的天堂手机在线 | 国产精品国产三级国产aⅴ中文 | 人妻丰满熟妇aⅴ无码 | www.国产在线视频 | 国产自偷自拍视频 | 飘花影院伦理片 | 午夜三级福利 | jav中文字幕 | 日韩视频一 | 嫩草影院在线免费观看 | 99国产精品国产免费观看 | 成人国产精品免费观看视频 | 免费观看nba乐趣影院 | 九热这里只有精品 | 男女做网站 | 久久国产精品精品国产 | 国产精品视频123 | 一级做a爱片久久毛片 | 一区二区三区伦理片 | 欧洲mv日韩mv国产 | 婷婷丁香激情五月 | 黄色无毒网站 | 看免费黄色大片 | av一本二本 | 国产尤物视频 | 夜色在线影院 | 欧美hdse| 色妞色视频一区二区三区四区 | 九九av在线 | 99热导航| 青青草在线免费 | 国产福利资源在线 | 美女脱裤子打屁股 | 午夜视频导航 | 国产91精品久久久久久久 | 亚洲69av| 成人免费黄色网 | 91极品身材尤物theporn | 国产精品亚洲自拍 | 免费性网站 | 日本伊人影院 | 色呦呦在线 | 麻豆com| 欧美丰满bbw | 亚洲成人久久久久 | 6699嫩草久久久精品影院 | 久久久久午夜 | jzjzjzjzj亚洲成熟少妇 | 男人的天堂免费 | 免费黄毛片 | 色综合久久88色综合天天6 | 在线看黄网址 | 久久久久久久亚洲av无码 | 老子影院午夜精品无码 | 成年人av在线 | 亚洲精品久久久久久一区二区 | 殴美一级片 | 一本到久久 | 国产极品一区 | 娇小激情hdxxxx学生 | 久久一区二区三区精品 | 欧美一级网 | 午夜视频欧美 | 超碰一级片 | 久久精品国产精品 | 亚洲欧美日韩国产 |