平面多边形凹凸判断(叉乘法)
生活随笔
收集整理的這篇文章主要介紹了
平面多边形凹凸判断(叉乘法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
參照《計算機圖形學》一書中的描述,多邊形(polygon)是由三個及以上的頂面坐標位置描述的平面圖形,這些頂點由多邊形的邊順序連接。多邊形的一個內角由兩個相鄰邊形成的邊界之內的角。如果所有內角均小于180度則稱為凸(convex)多邊形,否則為凹(concave)多邊形。
百度多邊形凹凸的判斷,主要方法有:凸包法、叉乘法(大于和小于180度的符號相反)、辛普森面積法。這里主要學習下叉乘的運用,并配上 C++ Qt 示例代碼。
判斷方法:為每一條邊建立一個向量,使用相鄰邊的叉積來測試凹凸性。凸多邊形的所有相鄰邊向量叉積同號。如果出現一些正一些負則為凹多邊形。
(網上找的圖,可以 ABC 分別看作 xyz。食指指向 x ,手心朝向 y 軸,大拇指向上的方向恰好是 z 的方向)
示例:
void Widget::paintEvent(QPaintEvent *) {//頂點,第一個為凸,第二個為凹/*QVector<QPointF> points = QVector<QPointF>()<<QPointF(50,50)<<QPointF(150,50)<<QPointF(150,100)<<QPointF(100,150)<<QPointF(50,100);*/QVector<QPointF> points = QVector<QPointF>()<<QPointF(50,50)<<QPointF(150,50)<<QPointF(150,150)<<QPointF(100,100)<<QPointF(50,150);//第一個點加到尾便于計算points.append(points.first());//凹標記bool concave = false;//邊向量for(int i = 0; i < points.size() - 2; i++){const QPointF &p1 = points.at(i);const QPointF &p2 = points.at(i + 1);const QPointF &p3 = points.at(i + 2);int cross_k = (p2.x() - p1.x()) * (p3.y() - p2.y()) -(p2.y() - p1.y()) * (p3.x() - p2.x());if(cross_k < 0){ //大于還是小于和邊向量取的方向有關concave = true;break;}}//叉乘判斷凹凸//繪制,紅色凹綠色凸QPainter painter(this);painter.setBrush(concave ? Qt::red : Qt::green);painter.drawPolygon(points); }總結
以上是生活随笔為你收集整理的平面多边形凹凸判断(叉乘法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 万科企业宗旨、愿景与核心价值观
- 下一篇: source-map配置