gpt4 book ai didi

c - 我怎么知道一个点是否在三角形中?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:52:32 33 4
gpt4 key购买 nike

我有一个简单的二维三角形。我一直在寻找如何知道给定点是否属于该三角形。这是算法(我在这里找到它:How to determine if a point is in a 2D triangle?),它非常好而且速度很快(根据其他人的说法):

float sign(int x0, int y0, int x1, int y1, int x2, int y2){
return (x0 - x2) * (y1 - y2) - (x1 - x2) * (y0 - y2);
}

int ptintr(int sx, int sy, int x0, int y0, int x1, int y1, int x2, int y2){
int b1, b2, b3;

b1 = sign(sx, sy, x0, y0, x1, y1) < 0.0f ? 1 : 0;
b2 = sign(sx, sy, x1, y1, x2, y2) < 0.0f ? 1 : 0;
b3 = sign(sx, sy, x2, y2, x0, y0) < 0.0f ? 1 : 0;

if((b1) == b2 && (b2 == b3))
return 1;
return 0;
}

我在 draw_ftriangle() 中调用这个函数:

void draw_ftriangle(SDL_Surface * s, int x0, int y0, int x1, int y1, int x2, int y2, unsigned color){
int ymin = min(y0, min(y1, y2));
int xmin = min(x0, min(x1, x2));
int ymax = max(y0, max(y1, y2));
int xmax = max(x0, max(x1, x2));

draw_line(s, x0, y0, x1, y1, color);
draw_line(s, x1, y1, x2, y2, color);
draw_line(s, x0, y0, x2, y2, color);

for(; ymin < ymax; ymin++)
for(; xmin < xmax; xmin++)
if(ptintr(xmin, ymin, x0, y0, x1, y1, x2, y2))
put_pixel(s, xmin, ymin, color);
}

这里sx和sy是给定点的坐标,x0,x1,x2,y0,y1,y2是三角形的点。但是这个算法是行不通的。每当我给这个函数一个点的坐标和一个三角形点的坐标时,它总是返回 false。谁能告诉我这个算法是否正确,或者我在这里留下了一些错误?

最佳答案

你的循环只执行第一行,因为 xmin 没有被重置。

换句话说,第一次通过内部 x 循环时,您将增加 xmin 直到它变为 xmax。第二次执行内部 x 循环时,xmin 已经是 xmax,所以什么也没有发生。

尝试

int x;
for(; ymin < ymax; ymin++)
for(x=xmin; x < xmax; x++)
if(ptintr(x, ymin, x0, y0, x1, y1, x2, y2))
put_pixel(s, x, ymin, color);

关于c - 我怎么知道一个点是否在三角形中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12762898/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com