3

私はこの問題の解決に近づいていますが、私に問題を引き起こしている部分が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));
}

ただし、何らかの理由で、線を描くときに線が揺れます(上下に数ピクセルだけですが、非常に目立ちます)。これと戦うために私は何ができますか?また、それほど厄介な方法はありませんか?

4

1 に答える 1

3

JoshCaswellのコメントは私にアイデアを与えました。この記事では、子の座標がローカル空間に格納されていることを示していますこれは以前から知っていたのですが、どういうわけか、どのように回転させてもビューが常に上を向くということになるのではないかと思いました。ワールド空間(または親空間)での座標に関してのみ回転されます。

したがって、スーパービューでタッチポイントを取得してから計算する代わりに、サブビューでタッチポイントを取得します。yの値を-2または任意の値に変更し(常にローカルスペースで上向きになるため、ルーラーのすぐ上)[self convertPoint:point toView:self.superview];、ビュー階層に難しい部分を処理させます。

于 2012-07-18T06:10:56.833 に答える