所以我试图生成一个NSBezierPath
看起来像两点之间的箭头的箭头,它可以位于视图上的任何位置,因此 startPoint 可以大于或小于端点。
当用户像在绘图应用程序中一样拖动鼠标时,箭头会更新。
我已经想通了,我可能必须使用转换和一些数学来做三角函数,并提出了这个实现:
+(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)
结果变成一条没有箭头的直线。
所以我认为我在转换矩阵中做错了。
如果有人知道我在哪里犯了错误,那就太好了。