0

序章:

マウスイベント(mouseDragged、mouseDown)を登録し、いくつかの修正を行った後、それらの場所をNSValueに変換します。その後、それらはNSMutableArrayに追加され、後で取り戻され、CGPointに変換され、GLFloat(頂点配列)に追加され、OpenGLを介して描画されます。しかし、objective-cがイベントを登録できるよりも速くマウスのドラッグが行われると、ポイント間に大きな間隔が表示されます。私はそれを修正する必要があります。

私のコードの詳細:

マウスイベントの場所のポイントは、登録後に編集され、彼から4ポイントを作成し、後でglQuadを描画します。これは次のようになります。

locationPoint = [self convertPoint: [event locationInWindow] fromView:self];

//Top left corner of quad
quadTopLeftCorner.x = locationPoint.x - someFloatValue;
quadTopLeftCorner.y = locationPoint.y + someFloatValue;
//Top right corner of quad
quadTopRightCorner.x = locationPoint.x + someFloatValue;
quadTopRightCorner.y = locationPoint.y + someFloatValue;
//Bottom left corner of quad
quadBottomLeftCorner.x = locationPoint.x - someFloatValue;
quadBottomLeftCorner.y = locationPoint.y - someFloatValue;
//Bottom right corner of quad
quadBottomRightCorner.x = locationPoint.x + someFloatValue;
quadBottomRightCorner.y = locationPoint.y - someFloatValue;

そして、それらはNSValueに変換され、NSMutableArrayに移動されます

someNSValueTopLeft = [NSValue valueWithPoint:quadTopLeftCorner];
someNSValueTopRight = [NSValue valueWithPoint:quadTopRightCorner];
someNSValueBottomLeft = [NSValue valueWithPoint:quadBottomLeftCorner];
someNSValueBottomRight = [NSValue valueWithPoint:quadBottomRightCorner];

[someNSMutableArray addObject:someNSValueTopLeft];
[someNSMutableArray addObject:someNSValueTopRight];
[someNSMutableArray addObject:someNSValueBottomLeft];
[someNSMutableArray addObject:someNSValueBottomRight];

そして、最後の2点間の距離が何かよりも大きいかどうかを確認したいと思います。もしそうなら、私はそれらの間にいくつかのポイントを追加したいと思います。だから私はこのようにしてみました:

    NSValue *someNSValueForLastNSValueTopLeft = [someNSMutableArray objectAtIndex:([someNSMutableArray count]-4)];
    CGPoint lastTopLeftQuadPoint = someNSValueForLastNSValueTopLeft.pointValue;
    int distx = (quadTopLeftCorner.x - lastTopLeftQuadPoint.x) * (quadTopLeftCorner.x - lastTopLeftQuadPoint.x);
    int disty = (quadTopLeftCorner.y - lastTopLeftQuadPoint.y) * (quadTopLeftCorner.y - lastTopLeftQuadPoint.y);
    int dist = sqrtf(distx + disty);
    
    if (dist > someFloatValue) {

        someNewPointForTopLeft.x = ((quadTopLeftCorner.x + lastTopLeftQuadPoint.x)/2);
        someNewPointForTopLeft.y = ((quadTopLeftCorner.y + lastTopLeftQuadPoint.y)/2);
        someNewPointForTopRight.x = someNewPointForTopLeft.x + someFloatValue;
        someNewPointForTopRight.y = someNewPointForTopLeft.y;
        someNewPointForBottomRight.x = someNewPointForTopLeft.x + someFloatValue;
        someNewPointForBottomRight.y = someNewPointForTopLeft.y - someFloatValue;
        someNewPointForBottomLeft.x = someNewPointForTopLeft.x;
        someNewPointForBottomLeft.y = someNewPointForTopLeft.y - someFloatValue;

        someNSValueTopLeft = [NSValue valueWithPoint:someNewPointForTopLeft];
        [vertices addObject:someNSValueTopLeft];
        someNSValueTopRight = [NSValue valueWithPoint:someNewPointForTopRight];
        [vertices addObject:someNSValueTopRight];
        someNSValueBottomLeft = [NSValue valueWithPoint:someNewPointForBottomRight];
        [vertices addObject:someNSValueBottomLeft];
        someNSValueBottomRight = [NSValue valueWithPoint:someNewPointForBottomLeft];
        [vertices addObject:someNSValueBottomRight];
    }

しかし、それは機能しません。誰かが私に別の方法を提案できますか?


結果:

ここに画像の説明を入力してください

4

1 に答える 1

0

効果は何ですか?

2つのバグがあることに注意してください。

  • 距離を計算する
  • クワッドの寸法

距離コードにいくつかのエラーがあります。これを試してください。

int distx = (quadTopLeftCorner.x - lastTopLeftQuadPoint.x) * (quadTopLeftCorner.x -lastTopLeftQuadPoint.x);        
int disty = (quadTopLeftCorner.y- lastTopLeftQuadPoint.y) * (quadTopLeftCorner.y - lastTopLeftQuadPoint.y);        
int dist = sqrtf(distx + disty); 

また、左上隅からクワッドを作成する場合は、someFloatValueを2倍にする必要があります。

someNewPointForTopLeft.x = ((quadTopLeftCorner.x + lastTopLeftQuadPoint.x)/2);         
someNewPointForTopLeft.y = ((quadTopLeftCorner.y + lastTopLeftQuadPoint.y)/2); 

someNewPointForTopRight.x = someNewPointForTopLeft.x + someFloatValue*2;         
someNewPointForTopRight.y = someNewPointForTopLeft.y;         

someNewPointForBottomRight.x = someNewPointForTopLeft.x + someFloatValue*2;         
someNewPointForBottomRight.y = someNewPointForTopLeft.y - someFloatValue*2;  

someNewPointForBottomLeft.x = someNewPointForTopLeft.x;         
someNewPointForBottomLeft.y = someNewPointForTopLeft.y - someFloatValue*2;

とにかく、コードと将来の管理を改善するために、Vectorライブラリを導入するコードを変更し、次のようなコードを作成することをお勧めします。

Vector a = lastPoint;
Vector b = currentPoint;
Vector newPointForQuad=lastPoint;

if ( (lastPoint-currentPoint).dist()> someDistanceValue) newPointForQuad = (lastPoint + currentPoint)/2;

Quad quad = makeQuadAroundPoint(newPointForQuad, someQuadSize);

この助けを願っています。

于 2012-08-07T09:45:16.060 に答える