在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象限空间中工作!!!与其算出你的数学,不如让我来告诉你,你可能会觉得这很有帮助。