【发布时间】:2013-01-08 03:25:52
【问题描述】:
所以我正在尝试生成一个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)
结果变成一条没有箭头的直线。
所以我认为我在转换矩阵中做错了什么。
如果有人知道我在哪里犯了错误,那就太好了。
【问题讨论】:
标签: objective-c macos drawing geometry