in code/richediting/src/main/kotlin/org/fbme/ide/richediting/adapters/ecc/ECTransitionPathPainter.kt [17:73]
fun paint(graphics: Graphics, drawArrow: Boolean) {
val g = graphics as Graphics2D
val s = path.source
val t = path.target
val c = path.centre
g.stroke = BasicStroke(2.5.toFloat())
// от такого надо избавляться, иначе координата поедет
if (!(s == t && s == c)) {
if (s == t) {
val cx1 = (c.x + s.x) / 2.0 - 30
val cy1 = (c.y + s.y) / 2.0 - 30
g.draw(ECTransitionUtils.fromPath(s, c, cx1, cy1))
val cx2 = (c.x + s.x) / 2.0 + 30
val cy2 = (c.y + s.y) / 2.0 + 30
val curve: QuadCurve2D = ECTransitionUtils.fromPath(c, t, cx2, cy2)
g.draw(ECTransitionUtils.fromPath(s, c, cx2, cy2))
val sat = AffineTransform()
var parameter = 0.6
val arrowPoint = ECTransitionUtils.getPointFromParameter(parameter, curve)
parameter += 0.01
var arrowPoint2 = ECTransitionUtils.getPointFromParameter(parameter, curve)
while (findDistance(arrowPoint, arrowPoint2) < 10) {
parameter += 0.01
arrowPoint2 = ECTransitionUtils.getPointFromParameter(parameter, curve)
}
sat.translate(arrowPoint.x.toDouble(), arrowPoint.y.toDouble())
sat.rotate((arrowPoint2.x - arrowPoint.x).toDouble(), (arrowPoint2.y - arrowPoint.y).toDouble())
graphics.fill(ARROW_SHAPE.createTransformedShape(sat))
} else {
val curve: QuadCurve2D = ECTransitionUtils.fromPath(s, t, c.x.toDouble(), c.y.toDouble())
g.draw(curve)
val hoverGraphics = graphics.create() as Graphics2D
hoverGraphics.color = MPSColors.YELLOW.darker()
if (cursor == ECTransitionCursor.SOURCE || cursor == ECTransitionCursor.TARGET) {
hoverGraphics.draw(curve)
}
val sat = AffineTransform()
var parameter = 0.96
var arrowPoint = ECTransitionUtils.getPointFromParameter(parameter, curve)
while (parameter < 0.995 && findDistance(arrowPoint, t) > 30) {
parameter += 0.005
arrowPoint = ECTransitionUtils.getPointFromParameter(parameter, curve)
}
while (parameter > 0.5 && findDistance(arrowPoint, t) < 15) {
parameter -= 0.01
arrowPoint = ECTransitionUtils.getPointFromParameter(parameter, curve)
}
sat.translate(arrowPoint.x.toDouble(), arrowPoint.y.toDouble())
sat.rotate((t.x - arrowPoint.x).toDouble(), (t.y - arrowPoint.y).toDouble())
graphics.fill(createArrow(findDistance(arrowPoint, t)).createTransformedShape(sat))
// или тут можно так:
// drawEdgesFromCircle(graphics, g, s, c, t);
}
}
}