我正在做一些核心图形,我想知道我如何知道一条线是否会在屏幕上看到它的某些部分。
让我们取一条从 x-5, y3 到 x2, y-7 的线。如果它是 1 像素宽,则屏幕上不会显示任何内容。如果它是 15 像素宽,它的某些部分将被显示。
我该如何检查?
最佳答案
如果您只有线条,则可以使用以下功能。否则,我会建议遍历您的线的整个长度并在特定距离内创建一个线宽大小的正方形,并检查它是否在您的 View 内。一个例子:如果你有一条从 x0y0 到 x7y0 的线。您将转到 x1y0 创建一个绘制线大小的正方形(在此示例中为 15),然后查看它是否与您的屏幕重叠。接下来转到 x2y0 等等。优点是它甚至可以使用贝塞尔曲线(一些关于贝塞尔曲线如何工作的维基信息就足够了)。
//编辑:(做了一点贝塞尔检查函数,应该可以工作,但还没有测试)而且我认为在绘制之前检查每一行的性能效率更高:
- (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
}
}
//编辑结束
但是现在让我们来看看简单的 line 函数:
- (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 条线,一条在原始线上方,一条在原始线下方,是绘制宽度的一半。后面的计算是获得绘制方向,以及与原始线的差异。但是对于那些想要进入它的人,这是我的预计算:
关于objective-c - 图形 - 考虑到一条线的宽度,我怎么知道它是否在屏幕上可见,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5596131/