Поэтому я пытаюсь создать 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)
результат становится прямой линией без наконечника стрелки.
Поэтому я думаю, что я делаю что-то неправильно в Матрице преобразований.
Если кто-то знает, где я ошибаюсь, было бы здорово.