欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【计算几何-点的定位】

程序员文章站 2022-04-02 09:37:01
...

1.二维坐标系,输入点的坐标(xi, yi),判断点是否在三角形内
判断原理:若点p在三角形内,Sabc = Spab + Spac + Spbc;


struct point{/*记录点的信息*/
    double x;
    double y;
};

struct v{/*记录边的信息*/
    point star;/*边的起点*/
    point en;/*边的终点*/
};

struct triangle{/*记录三角形信息*/
    point A;/*三角形的顶点A*/
    point B;/*三角形的顶点B*/
    point C;/*三角形的顶点C*/
};
triangle tre[104];
int tr;



double crossProduct(v * v1, v * v2);/*向量叉积*/
bool inTrianle(triangle t, point P);/*判断点是否在三角形内*/


double crossProduct(v * v1, v * v2){
    v vt1, vt2;
    double result = 0;
    vt1.star.x = 0;
    vt1.star.y = 0;
    vt1.en.x = v1->en.x - v1->star.x;
    vt1.en.y = v1->en.y - v1->star.y;

    vt2.star.x = 0;
    vt2.star.y = 0;
    vt2.en.x = v2->en.x - v2->star.x;
    vt2.en.y = v2->en.y - v2->star.y;

    result = vt1.en.x * vt2.en.y - vt2.en.x * vt1.en.y;
    return result;
}
bool inTrianle(triangle t, point p){
    v AB, AC, BC, PA, PB, PC;
    AB.star = t.A;
    AB.en = t.B;
    AC.star = t.A;
    AC.en = t.C;
    BC.star = t.B;
    BC.en = t.C;
    PA.star = p;
    PA.en = t.A;
    PB.star = p;
    PB.en = t.B;
    PC.star = p;
    PC.en = t.C;

    double Sabc = fabs(crossProduct(&AB, &AC));
    double Spab = fabs(crossProduct(&PA, &PB));
    double Spac = fabs(crossProduct(&PA, &PC));
    double Spbc = fabs(crossProduct(&PB, &PC));
    if(Sabc == Spab + Spac + Spbc)
        return true;
    else
        return false;
}

2.二维坐标系,输入点坐标(xi, yi),判断点是否在圆内
判断原理:若点在圆内,则点到圆心的距离小于等于半径

struct circle{
    int x;/*圆心的横坐标*/
    int y;/*圆心的纵坐标*/
    int r;/*圆的半径*/
};
circle cir[104];
int ci;

bool inCircle(circle t, int x, int y);/*判断点是否在圆内*/

bool inCircle(circle t, int x, int y){
    int ans = (x-t.x)*(x-t.x) + (y-t.y)*(y-t.y);
    if(ans <= t.r*t.r)
        return true;
    else
        return false;
}