1
所以我试图生成一个NSBezierPath
,它看起来像两个点之间的箭头,它可以位于视图上的任何位置,所以startPoint可以大于或小于端点。在两点之间绘制一条带NSBezierPath的箭头
用户在绘图应用程序中拖动鼠标时会更新箭头。
我已经想通了,我可能必须使用转换和一些数学做三角函数和想出了这个实现:
+(NSBezierPath *)arrowWithStart:(NSPoint)startPoint andEnd:(NSPoint)endPoint{
NSBezierPath* path = [NSBezierPath bezierPath];
CGFloat width = endPoint.x - startPoint.x;
CGFloat height = endPoint.y - startPoint.y;
CGFloat angle = atan2(width, height);
NSAffineTransform *tr = [NSAffineTransform transform];
[tr translateXBy:startPoint.x yBy:startPoint.y];
[tr scaleXBy:width yBy:height];
[tr rotateByDegrees:angle];
[path moveToPoint:CGPointZero];
[path lineToPoint:CGPointMake(0.75, 0.7)];
[path lineToPoint:CGPointMake(0.8, 0.65)];
[path lineToPoint:CGPointMake(1, 1)];
[path lineToPoint:CGPointMake(0.65, 0.8)];
[path lineToPoint:CGPointMake(0.7, 0.75)];
[path closePath];
[path transformUsingAffineTransform:tr];
return path;
}
此代码生成相当不错的箭头,当点是某种的对角线, 像
- (0,0)
- (-2,-2)
彼此,但是当点被越来越近到一个水平或垂直线,像
- (2,3)
- (5,3)
结果变成一个没有箭头的直线。
所以我认为我在转换矩阵中做了错误的事情。
如果有人知道我犯了什么错误,那会很好。
公式的第一个版本中出现了一个符号错误,我现在已经修复了这个错误。 –
编辑:你在这里比我快,再次感谢! – miradorn