本文主要是介绍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;
}
这篇关于C语言判断点是否在不规则四边形内部的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!