2013-11-15 40 views
1

我想在一行的頂部畫一個箭頭。 我知道startPoint和endPoint的座標,我也知道箭頭的角度和長度。在iOS中繪製箭頭背後的數學運算

我的邏輯是:開始點和結束點

  • 之間

    1. 計算傾斜角計算的箭頭點的位置

    我使用下面的公式:

    CGFloat endX = cos(angleOfArrowPoint-slopeAngle) * distance + point.x; 
    CGFloat endY = sin(angleOfArrowPoint-slopeAngle) * distance + point.y; 
    

    我在做什麼錯?

  • +0

    既然在你的問題的標題中你寫了「數學」,我建議你看看仿射變換,特別是在旋轉和翻譯?如果它們在您的編程環境中可用,並且您可以使用它們,則可以在不需要「原始」公式的情況下編寫代碼,但在更高的抽象級別上。 –

    +0

    這是怎麼回事?你能描述你所包含的代碼是在製作什麼嗎?這和你期望的有什麼不同?照片將是最好的。編輯:剛纔注意到這個問題有多老 - 你仍然有這個問題嗎?如果你自己修復它,你應該發佈你做的答案並接受它。 – GeneralMike

    +0

    你看過[這個答案](http://stackoverflow.com/a/13559449/77567)?這可能比你的方法更簡單。 –

    回答

    0

    這裏是我用兩個箭頭在兩端繪製線的方法,它向您顯示在一條線上繪製箭頭的數學。根據您的特定需求修改這些方法應該很容易。

    -(void)drawDoubleArrowLineInContext:(CGContextRef)inContext fromPoint:(CGPoint)inFromPoint toPoint:(CGPoint)inToPoint { 
    
        CGContextSetLineWidth(inContext, 1.0); 
        CGContextSetStrokeColorWithColor(inContext, [UIColor blackColor].CGColor ); 
        CGContextSetFillColorWithColor(inContext, [UIColor blackColor].CGColor); 
    
        CGContextBeginPath(inContext); 
        CGContextMoveToPoint(inContext, inFromPoint.x, inFromPoint.y); 
        CGContextAddLineToPoint(inContext, inToPoint.x, inToPoint.y); 
        CGContextClosePath(inContext); 
        CGContextDrawPath(inContext, kCGPathStroke); 
    
        [self drawArrowInContext:inContext atPoint:inFromPoint pointFrom:inToPoint]; 
        [self drawArrowInContext:inContext atPoint:inToPoint pointFrom:inFromPoint]; 
    } 
    
    -(void)drawArrowInContext:(CGContextRef)inContext atPoint:(CGPoint)inTipPoint pointFrom:(CGPoint)inFromPoint { 
        const CGFloat kArrowHeight = 15; 
        const CGFloat kArrowBaseHalfWidth = 5; 
    
        double arrowAngle = atan2((inFromPoint.y - inTipPoint.y), (inFromPoint.x - inTipPoint.x)); 
    
        CGContextBeginPath(inContext); 
        CGContextMoveToPoint(inContext, inTipPoint.x, inTipPoint.y); 
        CGContextAddLineToPoint(inContext, (inTipPoint.x + kArrowHeight*cos(arrowAngle)) - kArrowBaseHalfWidth*sin(arrowAngle), 
                 (inTipPoint.y + kArrowHeight*sin(arrowAngle)) + kArrowBaseHalfWidth*cos(arrowAngle)); 
        CGContextAddLineToPoint(inContext, (inTipPoint.x + kArrowHeight*cos(arrowAngle)) + kArrowBaseHalfWidth*sin(arrowAngle), 
                 (inTipPoint.y + kArrowHeight*sin(arrowAngle)) - kArrowBaseHalfWidth*cos(arrowAngle)); 
        CGContextAddLineToPoint(inContext, inTipPoint.x, inTipPoint.y); 
        CGContextClosePath(inContext); 
    
        CGContextDrawPath(inContext, kCGPathFillStroke); 
    }