前言
原版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;
}
相关图
四边形边界点
三个测试点
结果