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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2D简单图形相关算法罗列

發(fā)布時間:2025/4/16 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2D简单图形相关算法罗列 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

??? 因為平常在Qt開發(fā)過程中經(jīng)常會與一些簡單的2D幾何圖形打交道,因此學(xué)習(xí)和掌握一些基本的2D幾何計算還是很有必要的,在這里羅列一些常用的基本情況,之后會適時補充。

[1] 兩點之間距離,根據(jù)兩個點的差值算出對應(yīng)的向量,然后算出這個向量的斜邊開放即這兩點的距離。

qreal distance(const QPointF &pt1, const QPointF &pt2) {QPointF offset = pt1 - pt2;return sqrt(offset.x() * offset.x() + offset.y() * offset.y()); }

[2]? 計算兩條直線的交點

QPointF intersection(const QPointF &pt1, const QPointF &pt2, const QPointF &pt3, const QPointF &pt4) {// 首先根據(jù)兩點式 (y - y1) / (y2 - y1) = (x - x1) / (x2 - x1)// 得出 y = (y2 - y1) / (x2 - x1)(x - x1) + y1// 其中(y2 - y1) / (x2 - x1)為斜率k// 即 y = k(x - x1) + y1// 兩線平行即k1 == k2// 一線平行y即 p1.x == p2.xint state -- 標(biāo)志位 用來進(jìn)行簡單的情況判斷if (pt1.x() != pt2.x()){a = (p2.y() - p1.y()) / (p2.x() - p1.x());state |= 1; // 1即01 }if (pt3.x() != pt4.x()){b = (p4.y() - p3.y()) / (p4.x() - p3.x());state |= 2; // 2即10 }switch(sate){case 0: // 既不是01也不是10,即兩線同時平行于Yreturn QPointF();case 1: // 第一條直線斜線,第二條直線平行于Yfloat x = p3.x();float y = a * x - a * p1.x() + p1.y();return QPointF(x, y);case 2: // 第二條直線斜線,第一條直線平行于Yfloat x = p1.x();float y = b * x - a * p3.x() + p3.y();return QPointF(x, y);case 3: // 兩條直線都存在斜率if (a == b)return QPointF();float x = (a * p1.x() - b * p3.x() - p1.y() + p3.y()) / (a - b);float y = a * x - a * p1.x() + p1.y();return QPointF(x, y); } }

[3] 返回一點到直線的垂直交點的坐標(biāo)

QPointF Formula::verticalCrossPoint(const QPointF &pt1, const QPointF &pt2, const QPointF &pt3)
{
if
((fabs(pt1.x() - pt2.x()) < 1e-6)) // 判斷是否平行于Y軸 {return QPointF(pt1.x(), pt3.y());}// 直線 y = ax + b, 垂線則為 -ay = x - m // 直線斜率為k,垂線斜率為-1/kqreal a = (pt1.y()- pt2.y()) / (pt1.x()- pt2.x());qreal b = (pt1.y()- a * pt1.x());qreal m = pt3.x() + a * pt3.y();// 硬解求出交點 QPointF ptCross;ptCross.setX((m - a * b) / (a * a + 1));ptCross.setY(a * ptCross.x() + b);return ptCross
}

[4]? 判斷點是否在直線上,需要注意的是,浮點數(shù)與0的比較通常為 < 1e-6。

bool isPointInLIne(const QPointF &pt1, const QPointF &pt2, const QPointF &pt3) {if((fabs(pt1.x() - pt2.x()) < 1e-6)) // 判斷是否平行于Y軸 {return (fabs(pt1.x() - pt3.x()) < 1e-6);}// 因為 y = ax + b qreal A = (pt1.y()- pt2.y()) / (pt1.x()- pt2.x());qreal B = (pt1.y()- A*pt1.x());return (fabs(A * pt3.x() - pt3.y() + B) < 1e-6); }

[5] 根據(jù)直線的橫坐標(biāo)來求點

QPointF getPointInLineByX(const QPointF &pt1, const QPointF &pt2, qreal x) {if((fabs(pt1.x() - pt2.x()) < 1e-6)) // 是否平行于Y {return pt1;}if((fabs(pt1.y() - pt2.y()) < 1e-6)) // 是否平行于X {return QPointF(x, pt1.y());}// y = ax + bqreal A = (pt1.y()- pt2.y()) / (pt1.x()- pt2.x());qreal B = (pt1.y()- A*pt1.x());return QPointF(x, (A * x + B));
}

?[6] 根據(jù)直線的縱坐標(biāo)來求點

QPointF getPointInLineByY(const QPointF &pt1, const QPointF &pt2, qreal y) {if((fabs(pt1.x() - pt2.x()) < 1e-6)) {return QPointF(pt1.x(), y);}if((fabs(pt1.y() - pt2.y()) < 1e-6)){return pt1;}// y = ax + bqreal A = (pt1.y()- pt2.y()) / (pt1.x()- pt2.x());qreal B = (pt1.y()- A*pt1.x());return QPointF((qreal)(y - B) / A, y );}

?[7] 橢圓周長

// 橢圓周長:L = 2 π b + 4(a-b) // a表示橢圓長半軸的長,b表示橢圓短半軸的長,且a>b>0 qreal ellipsePerimeter(qreal a, qreal b) {qreal l = a / 2, s = b / 2;if(a < b){l = b / 2;s = a / 2;}return 2 * M_PI * s + 4 * (l - s); }

[8] 橢圓面積

// 橢圓的面積:S=π×a×b // π圓周率,a是橢圓的長半軸,b是短半軸的長 qreal ellipseArea(qreal a, qreal b) {return M_PI * a * b / 4; }

[9] 上下左右反轉(zhuǎn),返回變換矩陣

QTransform flipTransform(bool up,bool left) {int xSign = left ? 1 : -1;int ySign = up ? 1 : -1;return QTransform (xSign, 0, 0,0, ySign, 0,0, 0, 1); }

[10] 根據(jù)兩點直線,獲取從x軸正方向轉(zhuǎn)換到該直線的變換矩陣

QTransform rotateTransform(const QPointF &fromPos, const QPointF& toPos) {QVector2D directionVec = QVector2D(toPos) - QVector2D(fromPos);const qreal hypotenuse = directionVec.length();QTransform rotateTransfrom;if (hypotenuse!=0) {const qrealangleCos = directionVec.x() / hypotenuse,angleSin = directionVec.y() / hypotenuse;rotateTransfrom=QTransform(angleCos,angleSin, 0,-angleSin, angleCos, 0,0, 0, 1);}return rotateTransfrom; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/rickyk/p/3981689.html

總結(jié)

以上是生活随笔為你收集整理的2D简单图形相关算法罗列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产乱子伦视频一区二区三区 | www毛片com| av在线专区 | 三级亚洲 | 日韩成人高清视频在线观看 | 成人区视频 | 女优一区二区三区 | 黄色网址你懂的 | 欧美激情视频网站 | 欧美xxxx中国 | 久久免费公开视频 | 五月天啪啪 | 狠狠干2017 | 精品久久久久久久久久久久久 | 另类综合在线 | 国产在线三区 | 久久依人 | 国产精品久久久久久久久久久久久 | 国产乱码精品一区二区三区亚洲人 | 亚洲欧美中文日韩在线观看 | 日日夜夜精| 在线观看国产小视频 | 久久高清毛片 | 波多野结衣一区二区三区四区 | 精品乱码一区二区三区四区 | 久久免费电影 | 操亚洲美女 | 欧美性猛交一区二区三区精品 | 夜夜操夜夜摸 | 在线观看日本网站 | 草比视频在线观看 | 影音先锋中文字幕在线视频 | 亚洲第一天堂av | 任我爽在线 | 天天干天天操天天摸 | 日本五十路在线 | 99这里都是精品 | 黄片毛片在线看 | 91福利影院 | 色婷婷综合在线 | 欧美一卡二卡三卡四卡 | 国产av成人一区二区三区高清 | 国产你懂得 | 日韩狠狠 | 97视频网站 | 国产av天堂无码一区二区三区 | 日本一区二区三区久久久久 | 中文字幕人妻一区二区在线视频 | 亚洲激情一区二区三区 | 国产毛片久久 | 欧美视频免费看 | 精品无人国产偷自产在线 | 日批视屏| 超碰在线免费播放 | 色婷婷aⅴ | 欧美射图| 精品视频免费看 | 69av国产| 啪视频免费 | 日本不卡一区二区在线观看 | 亚洲视频 中文字幕 | 网站国产| 91精品综合久久久久久五月天 | 国产老妇伦国产熟女老妇视频 | 天天摸天天爽 | 天天狠天天操 | 日本在线第一页 | 亚洲看 | 亚洲电影在线观看 | 啪啪激情网 | 在线中文字幕网站 | 黄毛片在线观看 | 成人片在线播放 | 日本少妇做爰全过程毛片 | 日韩免费影视 | 东京热加勒比无码少妇 | 成人国产精品久久久网站 | 久久久免费网站 | 一级艳片新婚之夜 | 人妻巨大乳一二三区 | 久草免费在线观看 | mm131丰满少妇人体欣赏图 | 1769国产| 久久久久99精品成人片试看 | 国产精品伦理 | 男女啪啪av | 91最新地址| 中文字幕第7页 | 免费淫片| 久久久看 | 综合 欧美 亚洲日本 | 欧美成人免费一级人片100 | 欧洲精品码一区二区三区免费看 | √资源天堂中文在线 | 高清乱码免费网 | 久久网国产| 高清不卡一区二区三区 | 国产成人精品一区二区在线观看 | 国产农村妇女精品一二区 |