通过坐标区分凹凸四边形

要通过坐标区分凹凸四边形,首先需要知道四边形的四个顶点的坐标。假设四边形的顶点分别为A(x1, y1),B(x2, y2),C(x3, y3)和D(x4, y4)。然后,可以通过计算向量积(叉积)来判断四边形是凹的还是凸的。

步骤如下:

计算向量AB和向量BC的叉积: ( x 2 − x 1 ) × ( y 3 − y 2 ) − ( y 2 − y 1 ) × ( x 3 − x 2 ) (x2 - x1) \times (y3 - y2) - (y2 - y1) \times(x3 - x2) (x2x1)×(y3y2)(y2y1)×(x3x2)

计算向量BC和向量CD的叉积: ( x 3 − x 2 ) × ( y 4 − y 3 ) − ( y 3 − y 2 ) × ( x 4 − x 3 ) (x3 - x2) \times(y4 - y3) - (y3 - y2) \times(x4 - x3) (x3x2)×(y4y3)(y3y2)×(x4x3)

计算向量CD和向量DA的叉积: ( x 4 − x 3 ) × ( y 1 − y 4 ) − ( y 4 − y 3 ) × ( x 1 − x 4 ) (x4 - x3) \times (y1 - y4) - (y4 - y3) \times (x1 - x4) (x4x3)×(y1y4)(y4y3)×(x1x4)

计算向量DA和向量AB的叉积: ( x 1 − x 4 ) × ( y 2 − y 1 ) − ( y 1 − y 4 ) × ( x 2 − x 1 ) (x1 - x4) \times (y2 - y1) - (y1 - y4) \times (x2 - x1) (x1x4)×(y2y1)(y1y4)×(x2x1)

如果以上四个叉积的结果都是正数或者都是负数,那么这个四边形是凸四边形。如果有正有负,那么这个四边形是凹四边形。

#include 
using namespace std;

double x[5], y[5], k[4];

int main() {
    for (int i = 1; i <= 4; i ++ ) {
        cin >> x[i] >> y[i];
    }
    
    k[0] = (x[2] - x[1]) * (y[3] - y[2]) - (y[2] - y[1]) * (x[3] - x[2]);
    k[1] = (x[3] - x[2]) * (y[4] - y[3]) - (y[3] - y[2]) * (x[4] - x[3]);
    k[2] = (x[4] - x[3]) * (y[1] - y[4]) - (y[4] - y[3]) * (x[1] - x[4]);
    k[3] = (x[1] - x[4]) * (y[2] - y[1]) - (y[1] - y[4]) * (x[2] - x[1]);
    
    int ans = 0;
    for(int i = 0; i < 4; i ++ ) {
        if(k[i] < 0) {
            ans++;
        }
    }
    
    if(ans == 4 || ans == 0) {
        cout << "Yes";
    } else {
        cout << "No";
    }
}

你可能感兴趣的:(算法(学习笔记),c++,线性代数)