私はこの問題の解決に近づいていますが、私に問題を引き起こしている部分が1つあります。ユーザーが回転、拡大縮小、キャンバス上に配置してから、エッジに沿ってトレースしてキャンバス上にマークを付けることができる定規オブジェクトを模倣しようとしています。私が抱えている問題は、ユーザーの指がどこに行っても、ライン上の次のポイントを取得することです。法線をポイントからエッジに沿った小さな透明なビューまでさかのぼることができますが、エイリアシング(または何か)のために、純粋な直線以外の角度(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));
}
ただし、何らかの理由で、線を描くときに線が揺れます(上下に数ピクセルだけですが、非常に目立ちます)。これと戦うために私は何ができますか?また、それほど厄介な方法はありませんか?