#include <stdio.h>
#include <stdlib.h>
struct pt
{
float x,y;
};
struct quat
{
pt points[4];
};
float crossmulti2d( float x1, float y1, float x2, float y2)
{
return x1 * y2 - x2 * y1;
}
bool inquat( quat _q, pt _pt)
{
pt vec1, vec2;
vec1.x = _q.points[1].x - _q.points[0].x;
vec1.y = _q.points[1].y - _q.points[0].y;
vec2.x = _pt.x - _q.points[0].x;
vec2.y = _pt.y - _q.points[0].y;
if( crossmulti2d( vec2.x, vec2.y, vec1.x, vec1.y ) < 0 )
{
return false;
}
vec1.x = _q.points[2].x - _q.points[1].x;
vec1.y = _q.points[2].y - _q.points[1].y;
vec2.x = _pt.x - _q.points[1].x;
vec2.y = _pt.y - _q.points[1].y;
if( crossmulti2d(vec2.x, vec2.y, vec1.x, vec1.y) < 0 )
{
return false;
}
vec1.x = _q.points[3].x - _q.points[2].x;
vec1.y = _q.points[3].y - _q.points[2].y;
vec2.x = _pt.x - _q.points[2].x;
vec2.y = _pt.y - _q.points[2].y;
if( crossmulti2d(vec2.x, vec2.y, vec1.x, vec1.y) < 0 )
{
return false;
}
vec1.x = _q.points[0].x - _q.points[3].x;
vec1.y = _q.points[0].y - _q.points[3].y;
vec2.x = _pt.x - _q.points[3].x;
vec2.y = _pt.y - _q.points[3].y;
if( crossmulti2d(vec2.x, vec2.y, vec1.x, vec1.y ) < 0 )
{
return false;
}
return true;
}
int main()
{
quat shape = {
{ {1, 1},{2, 1}, {1, 0},{0, 0} }
};
pt tests[] = {
{0.0, 1.0},
{1.0, 0.5},
{1.5, 0},
{1.5, 0.5},
{1.5, 0.52},
{1.5, 0.49}
};
for(int i =0; i<sizeof(tests)/sizeof(pt); ++i)
{
if( inquat(shape, tests[i]) == true )
{
printf("pass\n");
}
else
{
printf("failed\n");
}
}
return 0;
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。