gpt4 book ai didi

objective-c - 图形 - 我如何知道一条线是否在屏幕上可见(考虑到它的宽度)

转载 作者:搜寻专家 更新时间:2023-10-30 19:42:54 24 4
gpt4 key购买 nike

我正在做一些核心图形,我想知道我如何知道一条线是否会在屏幕上显示它的某些部分。

让我们画一条从 x-5, y3 到 x2, y-7 的直线。如果它是 1 像素宽,则屏幕上不会显示任何内容。如果它的宽度为 15 像素,则会显示它的某些部分。

我该如何检查?

最佳答案

如果你只有线条,你可以使用下面的函数。否则我会建议通过你的线的整个长度并在特定距离内创建线宽大小的正方形并检查它是否在你的 View 内。一个例子:如果你有一条从 x0y0 到 x7y0 的线。你会去 x1y0 创建一个你的画线大小的正方形(在这个例子中是 15),看看它是否与你的屏幕重叠。接下来转到 x2y0 等等。优点是它甚至可以使用贝塞尔曲线(关于贝塞尔曲线的一些 wiki 信息就足够了)。

//编辑:(做了一点贝塞尔曲线检查功能,应该可以工作,但还没有测试过)而且我不认为在绘制之前检查每条线的性能效率更高:

- (void)bezierWithStart:(CGPoint)start cp1:(CGPoint)cp1 cp2:(CGPoint)cp2 end:(CGPoint)end withWidth:(float)wid {
for (float i = 0.0; i<=1.0; i+=0.05) { // how many steps
CGPoint chk1 = CGPointMake(start.x+((cp1.x-start.x)*i), start.y+((cp1.y-start.y)*i));
CGPoint chk2 = CGPointMake(cp1.x+((cp2.x-cp1.x)*i), cp1.y+((cp2.y-cp1.y)*i));
CGPoint chk3 = CGPointMake(cp2.x+((end.x-cp2.x)*i), cp2.y+((end.y-cp2.y)*i));

CGPoint chk4 = CGPointMake(chk1.x+((chk2.x-chk1.x)*i), chk1.y+((chk2.y-chk1.y)*i));
CGPoint chk5 = CGPointMake(chk2.x+((chk3.x-chk2.x)*i), chk2.y+((chk3.y-chk2.y)*i));

CGPoint cPoint = CGPointMake(chk4.x+((chk5.x-chk4.x)*i), chk4.y+((chk5.y-chk4.y)*i));

CGRect drawLine = CGRectMake(cPoint.x-(wid/2), cPoint.y-(wid/2), wid, wid);

// check if rect is in view
}
}

//编辑结束

但现在让我们转到简单的行函数:

- (void)testLine:(CGPoint)fp toSecond:(CGPoint)sp withWidth:(float)wid {
float xratio = sp.x - fp.x;
float yratio = sp.y - fp.y;
double a = sqrt(((wid*wid)*(xratio*xratio))/((yratio*yratio)+(xratio*xratio)));
a/=2; // because line width goes in both direction
double b = (yratio/xratio)*a;
if ((xratio<0.0 && yratio<0.0) || (xratio>0.0 && yratio>0.0))b*=-1;
CGPoint diffFrom1 = CGPointMake(fp.x+a, fp.y+b);
CGPoint diffTo1 = CGPointMake(sp.x+a, sp.y+b);
a*=-1;
b*=-1;
CGPoint diffFrom2 = CGPointMake(fp.x+a, fp.y+b);
CGPoint diffTo2 = CGPointMake(sp.x+a, sp.y+b);
}

您将获得 4 分。 2 条线,一条在原始线上方,一条在原始线下方,宽度为绘图宽度的一半。后面的计算是获取绘制方向以及与原始线的差异。但是对于那些想要进入它的人来说,这是我的预先计算:

enter image description here

关于objective-c - 图形 - 我如何知道一条线是否在屏幕上可见(考虑到它的宽度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5596131/

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