C语言判断点是否在不规则四边形内部

最近在做人脸设备区域屏蔽功能,说白了就是对人脸进行过滤;
在四边形内的人脸不进行检测,其中涉及到一个算法,即判断点是否在四边形内部,网上查了下,最简单方便的便是向量积法,如下:
先提供一种简单情景(假定四边形是一个凸四边形)的解决方法:
原理:凸多边形内部的点都在凸多边形的边所在的向量的同一侧(前提是计算边所在的向量时采用的是同一个方向,同为顺时针或者同为逆时针),利用叉积求解。
假设四边形四个顶点依次为A(x1,y1),B(x2,y2),C(x3,y3),D(x4,y4),待判断的点为P(x,y),如果点P在四边形内部,则向量AB * AP(注意:1.这是求叉积;2.AB、AP均为向量,也就等于(x2-x1) * (y-y1)-(y2-y1) * (x-x1))的值与BC*BP、CD * CP、DA * DP的值同号(若有等于零的情况,则表示P在边上,可以根据自己的喜好把它当做是内部或者外部),即四个值同为正或者同为负,则点P在ABCD内部,否则在外部。

总结:叉积是判断多边形凹凸性以及点是否在凸多边形内部的利器。

向量AB(B.x - A.x , B.y - A.y);
向量AP(P.x - A.x , P.y - A.y);
向量叉乘ABxAP = (B.x - A.x) * (P.y - A.y) - (B.y - A.y) * (P.x - A.x);

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
static int x1 = 284, x2 = 875, x3 = 470, x4 = 119;
static int y1 = 309, y2 = 362, y3 = 914, y4 = 753;

int isPointInRect(int x, int y)
{
	
	int a, b, c,d;//分别存四个向量的计算结果;
	a = (x2 - x1)*(y - y1) - (y2 - y1)*(x - x1);  
    b = (x3 - x2)*(y - y2) - (y3 - y2)*(x - x2);  
    c = (x4 - x3)*(y - y3) - (y4 - y3)*(x - x3);  
    d = (x1 - x4)*(y - y4) - (y1 - y4)*(x - x4);  
    if((a > 0 && b > 0 && c > 0 && d > 0) || (a < 0 && b < 0 && c < 0 && d < 0)) 
	{  
            return 1;  
    }  
	else
	{
		return 0;
	}
}
int main()
{
	int status;
	status = isPointInRect(2,3);
	printf("#########: %d\n", status);
	
	return 0;
}
发布了13 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sdsszk/article/details/84978365