gpt4 book ai didi

objective-c - 沿标尺对象的边缘绘图

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:06:56 25 4
gpt4 key购买 nike

我快要解决这个问题了,但是有一个部分给我带来了麻烦。我试图模仿一个标尺对象,用户可以旋转、缩放和放置在 Canvas 上,然后沿着边缘追踪以在 Canvas 上做一个标记。我遇到的问题是无论用户的手指去哪里,都得到线上的下一个点。我可以将法线从该点追溯到沿着我所拥有的边缘的一个小透明 View ,但是由于锯齿(或其他原因),当它以除纯直线角度(0、90、180)以外的任何角度绘制时,该线会抽动, 270).我还尝试编写一个像 CGRectContainsPoint 这样的函数,除了它需要一个任意旋转的矩形,但我没有成功。

下面是根据用户触摸计算点数的代码:

- (CGPoint)perpendicularPointFromPoint:(CGPoint)point
{
CGPoint testPoint1 = point;
CGPoint testPoint2 = testPoint1;
CGPoint pointToUse = CGPointZero;

//Get the right angle to the current rotation, and make
//a unit vector in that direction
CGFloat rightAngle = mCurRotation + M_PI_2;
CGFloat xInc = cosf(rightAngle);
CGFloat yInc = sinf(rightAngle);

//Check both "forward" and "backward"
int counter = 0;
while(pointToUse.x == 0)
{
testPoint1.x += xInc;
testPoint1.y += yInc;
testPoint2.x -= xInc;
testPoint2.y -= yInc;

//mLineOutline is a small view on top of the ruler (transparent)
if([self.superview hitTest:testPoint1 withEvent:nil] == mLineOutline)
{
pointToUse = testPoint1;
}
else if([self.superview hitTest:testPoint2 withEvent:nil] == mLineOutline)
{
pointToUse = testPoint2;
}
else if(counter++ > 1000) //Neither ray intersects the ruler
pointToUse.x = -1.f;
}

return CGPointMake(roundf(pointToUse.x), roundf(pointToUse.y));
}

但是,无论出于何种原因,线条在我绘制时会抖动(上下只有几个像素,但非常明显)。我能做些什么来解决这个问题?还有,有没有比较别扭的方法?

最佳答案

Josh Caswell 的评论给了我一个主意。在 this article,它表示 children 中的坐标存储在本地空间中。我以前就知道这一点,但不知怎的我忘记了这意味着无论你如何旋转它, View 总是朝上的。它仅根据其在世界空间(或父空间)中的坐标进行旋转。

因此,我不是在父 View 上获取触摸点然后进行计算,而是在 subview 上获取触摸点。将它的 y 值更改为 -2 或任何我想要的值(就在标尺上方,因为它在局部空间中总是面朝上)然后 [self convertPoint:point toView:self.superview]; 让 View 层次结构处理困难的部分。

关于objective-c - 沿标尺对象的边缘绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11534440/

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