前言

原版JS代码参考:面试题:用js检测两个线段是否相交

代码

魔改为C语言后如下:

#include <stdio.h>
#include <stdlib.h>

//计算向量叉乘
float crossMul(float* v1, float* v2)
{
    return v1[0] * v2[1] - v1[1] * v2[0];
}

// 判断两条线段是否相交 
float checkCross(float* p1, float* p2, float* p3, float* p4)
{
    float v1[2], v2[2], v3[2], v4[2];
    v1[0] = p1[0] - p3[0];
    v1[1] = p1[1] - p3[1];
    v2[0] = p2[0] - p3[0];
    v2[1] = p2[1] - p3[1];
    v3[0] = p4[0] - p3[0];
    v3[1] = p4[1] - p3[1];

    float v = crossMul(v1, v3) * crossMul(v2, v3);
    v1[0] = p3[0] - p1[0];
    v1[1] = p3[1] - p1[1];
    v2[0] = p4[0] - p1[0];
    v2[1] = p4[1] - p1[1];
    v3[0] = p2[0] - p1[0];
    v3[1] = p2[1] - p1[1];

    return (v <= 0 && crossMul(v1, v3) * crossMul(v2, v3) <= 0) ? 1 : 0;
}

// 判断点是否在多边形内 
int checkPP(float* point, float** polygon, int len) {

    float *p1, p2[2], *p3, *p4;
    p1 = point;
    p2[0] = -100;
    p2[1] = p1[1];

    int count = 0;
    //对每条边都和射线作对比 
    int i = 0;
    for (i = 0; i < len - 1; i++) {
        p3 = polygon[i];
        p4 = polygon[i + 1];
        if (checkCross(p1, p2, p3, p4) == 1) {
            count++;
        }
    }
    p3 = polygon[len - 1];
    p4 = polygon[0];
    if (checkCross(p1, p2, p3, p4) == 1) {
        count++;
    }

    return (count % 2 == 0) ? 0 : 1;
}

int main()
{
    float pt1[2] = {100, 500};
    float pt2[2] = {100, 450};
    float pt3[2] = {200, 200};

    float **pts = NULL;

    int i = 0;
    for(i = 0; i < 2; i++)
    {
        pts = (float **)malloc(2*sizeof(float*));
    }

    for(i = 0; i < 4; i++)
    {
        pts[i] = (float*)malloc(4*sizeof(float));
    }

    pts[0][0] = 100;
    pts[0][1] = 500;
    pts[1][0] = 400;
    pts[1][1] = 500;
    pts[2][0] = 700;
    pts[2][1] = 300;
    pts[3][0] = 150;
    pts[3][1] = 100;

    if(1 == checkPP(pt1, pts, 4))
        printf("yes\n");
    else
        printf("no\n");

    if(1 == checkPP(pt2, pts, 4))
        printf("yes\n");
    else
        printf("no\n");

    if(1 == checkPP(pt3, pts, 4))
        printf("yes\n");
    else
        printf("no\n");
    
    free(pts);
    pts = NULL;

    return 0;
}

相关图

四边形边界点

C语言 判断 点(坐标)是否在多边形内_算法

三个测试点

C语言 判断 点(坐标)是否在多边形内_算法_02

结果

C语言 判断 点(坐标)是否在多边形内_测试点_03