在iOS中绘制箭头背后的数学

在iOS中绘制箭头背后的数学,ios,math,geometry,Ios,Math,Geometry,我想在一条线上画一个箭头。 我知道起点和终点的坐标,也知道箭头的角度和长度 我的逻辑是: 计算起点和终点之间的坡度角 计算箭头点的位置 我使用以下公式: CGFloat endX = cos(angleOfArrowPoint-slopeAngle) * distance + point.x; CGFloat endY = sin(angleOfArrowPoint-slopeAngle) * distance + point.y; 我做错了什么?这里有一个方法,我用它来画两端都有箭头的直线,

我想在一条线上画一个箭头。 我知道起点和终点的坐标,也知道箭头的角度和长度

我的逻辑是:

  • 计算起点和终点之间的坡度角
  • 计算箭头点的位置
  • 我使用以下公式:

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

    我做错了什么?

    这里有一个方法,我用它来画两端都有箭头的直线,它向你展示了在直线上画箭头的数学方法。根据您的具体需要修改这些方法应该很容易

    -(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 );
    }
    

    既然你在题目中写了“数学”,我建议你看看仿射变换,尤其是旋转和平移?如果它们在您的编程环境中可用,并且您可以使用它们,那么您将能够在更高的抽象级别编写代码,而不需要“原始”公式。这怎么不起作用?你能描述一下你包含的代码是如何产生的吗?这和你期望的有什么不同?照片最好。编辑:刚刚注意到这个问题有多老了-你仍然有这个问题吗?如果你自己修复了它,你应该把你所做的作为一个答案,并接受它。你看过吗?可能的问题:1。检查cos,sin角是否需要弧度或度数,2。箭头的一个端点是-angle,第二个端点当然是+angle。3.你用过atan2吗?用于直线角度检测!!!clasical atan不能在完整的4象限空间中工作!!!与其算出你的数学,不如让我来告诉你,你可能会觉得这很有帮助。