diff --git a/script/BaseEdge.js b/script/BaseEdge.js index cd5faaa..6f0569f 100755 --- a/script/BaseEdge.js +++ b/script/BaseEdge.js @@ -101,7 +101,7 @@ BaseEdge.prototype.GetPixelLength = function () { if (this.vertex1 == this.vertex2) { - return (new CommonEdgeStyle()).sizeOfLoop * 2 * Math.PI; + return this.model.GetLoopSize() * 2 * Math.PI; } else { diff --git a/script/BaseEdgeDrawer.js b/script/BaseEdgeDrawer.js index 799ce69..3196e73 100644 --- a/script/BaseEdgeDrawer.js +++ b/script/BaseEdgeDrawer.js @@ -10,8 +10,6 @@ function CommonEdgeStyle() this.fillStyle = '#68aeba'; this.textPadding = 4; this.textStrockeWidth = 2; - this.sizeOfLoop = 24; - this.loopShiftAngel = Math.PI / 6; } function CommonPrintEdgeStyle() @@ -178,7 +176,7 @@ BaseEdgeDrawer.prototype.SetupStyle = function(baseEdge, arcStyle) this.context.lineWidth = baseEdge.model.width; this.context.strokeStyle = arcStyle.strokeStyle; this.context.fillStyle = arcStyle.fillStyle; - this.sizeOfLoop = baseEdge.vertex1.model.diameter / 2; + this.model = baseEdge.model; } BaseEdgeDrawer.prototype.DrawArc = function(position1, position2, arcStyle) @@ -192,8 +190,8 @@ BaseEdgeDrawer.prototype.DrawArc = function(position1, position2, arcStyle) if (position1.equals(position2)) { this.context.beginPath(); - this.context.arc(position1.x - Math.cos(arcStyle.loopShiftAngel) * arcStyle.sizeOfLoop, - position1.y - Math.sin(arcStyle.loopShiftAngel) * arcStyle.sizeOfLoop, arcStyle.sizeOfLoop, 0, 2 * Math.PI); + this.context.arc(position1.x - Math.cos(this.model.GetLoopShiftAngel()) * this.model.GetLoopSize(), + position1.y - Math.sin(this.model.GetLoopShiftAngel()) * this.model.GetLoopSize(), this.model.GetLoopSize(), 0, 2 * Math.PI); this.context.closePath(); this.context.stroke(); } @@ -313,8 +311,8 @@ BaseEdgeDrawer.prototype.GetTextCenterPoint = function (position1, position2, ha var centerPoint = Point.interpolate(position1, position2, 0.5); if (position1.equals(position2)) { - centerPoint.y = centerPoint.y - Math.cos(arcStyle.loopShiftAngel) * arcStyle.sizeOfLoop * 2; - centerPoint.x = centerPoint.x - Math.sin(arcStyle.loopShiftAngel) * arcStyle.sizeOfLoop * 2; + centerPoint.y = centerPoint.y - Math.cos(this.model.GetLoopShiftAngel()) * this.model.GetLoopSize() * 2; + centerPoint.x = centerPoint.x - Math.sin(this.model.GetLoopShiftAngel()) * this.model.GetLoopSize() * 2; } return centerPoint; @@ -351,11 +349,11 @@ ProgressArcDrawer.prototype.Draw = function(baseEdge, arcStyle) if (positions[0].equals(positions[1])) { - var sizeInRadian = progressSize / (2 * Math.PI * arcStyle.sizeOfLoop) * 6; + var sizeInRadian = progressSize / (2 * Math.PI * this.baseDrawer.model.GetLoopSize()) * 6; this.context.beginPath(); - this.context.arc(positions[0].x - Math.cos(arcStyle.loopShiftAngel) * arcStyle.sizeOfLoop, - positions[0].y - Math.sin(arcStyle.loopShiftAngel) * arcStyle.sizeOfLoop, arcStyle.sizeOfLoop, this.progress * 2 * Math.PI, this.progress * 2 * Math.PI + sizeInRadian); + this.context.arc(positions[0].x - Math.cos(this.baseDrawer.model.GetLoopShiftAngel()) * this.baseDrawer.model.GetLoopSize(), + positions[0].y - Math.sin(this.baseDrawer.model.GetLoopShiftAngel()) * this.baseDrawer.model.GetLoopSize(), this.baseDrawer.model.GetLoopSize(), this.progress * 2 * Math.PI, this.progress * 2 * Math.PI + sizeInRadian); this.context.closePath(); this.context.stroke(); } @@ -387,8 +385,8 @@ CurvedArcDrawer.prototype.DrawArc = function(position1, position2, arcStyle) if (position1.equals(position2)) { this.context.beginPath(); - this.context.arc(position1.x - Math.cos(arcStyle.loopShiftAngel) * arcStyle.sizeOfLoop, - position1.y - Math.sin(arcStyle.loopShiftAngel) * arcStyle.sizeOfLoop, arcStyle.sizeOfLoop, 0, 2 * Math.PI); + this.context.arc(position1.x - Math.cos(this.model.GetLoopShiftAngel()) * this.model.GetLoopSize(), + position1.y - Math.sin(this.model.GetLoopShiftAngel()) * this.model.GetLoopSize(), this.model.GetLoopSize(), 0, 2 * Math.PI); this.context.closePath(); this.context.stroke(); } @@ -426,8 +424,8 @@ CurvedArcDrawer.prototype.GetTextCenterPoint = function (position1, position2, h var centerPoint = this.model.GetCurvedPoint(position1, position2, 0.5) if (position1.equals(position2)) { - centerPoint.y = centerPoint.y - Math.cos(arcStyle.loopShiftAngel) * arcStyle.sizeOfLoop * 2; - centerPoint.x = centerPoint.x - Math.sin(arcStyle.loopShiftAngel) * arcStyle.sizeOfLoop * 2; + centerPoint.y = centerPoint.y - Math.cos(this.model.GetLoopShiftAngel()) * this.model.GetLoopSize() * 2; + centerPoint.x = centerPoint.x - Math.sin(this.model.GetLoopShiftAngel()) * this.model.GetLoopSize() * 2; } return centerPoint; diff --git a/script/EdgeModel.js b/script/EdgeModel.js index d9ee74b..8126f31 100755 --- a/script/EdgeModel.js +++ b/script/EdgeModel.js @@ -11,6 +11,8 @@ function EdgeModel() this.type = EdgeModels.line; this.curvedValue = EdgeModel.prototype.defaultCruved; this.default = true; + this.sizeOfLoop = 24; + this.loopShiftAngel = Math.PI / 6; } EdgeModel.prototype.defaultCruved = 0.1; @@ -101,9 +103,19 @@ EdgeModel.prototype.HitTestLine = function(position1, position2, mousePos, facto factor = 1.0; } + var pos1 = position1; var pos2 = position2; var pos0 = mousePos; + + // Self loop case + if (pos1.equals(pos2)) + { + var xCenter = pos1.x - Math.cos(this.GetLoopShiftAngel()) * this.GetLoopSize(); + var yCenter = pos1.y - Math.sin(this.GetLoopShiftAngel()) * this.GetLoopSize(); + + return Math.abs((Point.distance(new Point(xCenter, yCenter), pos0)) - this.GetLoopSize()) <= this.width * 1.5 * factor; + } var r1 = pos0.distance(pos1); var r2 = pos0.distance(pos2); @@ -127,6 +139,19 @@ EdgeModel.prototype.HitTestLine = function(position1, position2, mousePos, facto EdgeModel.prototype.HitTestCurved = function(position1, position2, mousePos) { + var pos1 = position1; + var pos2 = position2; + var pos0 = mousePos; + + // Self loop case + if (pos1.equals(pos2)) + { + var xCenter = pos1.x - Math.cos(this.GetLoopShiftAngel()) * this.GetLoopSize(); + var yCenter = pos1.y - Math.sin(this.GetLoopShiftAngel()) * this.GetLoopSize(); + + return Math.abs((Point.distance(new Point(xCenter, yCenter), pos0)) - this.GetLoopSize()) <= this.width * 1.5; + } + var interval_count = position1.distance(position2) / 100 * 30; var start = position1; @@ -174,3 +199,14 @@ EdgeModel.prototype.SetCurvedValue = function (value) this.default = false; } + +EdgeModel.prototype.GetLoopSize = function () +{ + return this.sizeOfLoop; +} + +EdgeModel.prototype.GetLoopShiftAngel = function () +{ + return this.loopShiftAngel; +} + diff --git a/tpl/home.php b/tpl/home.php index 7a837f8..98051f5 100755 --- a/tpl/home.php +++ b/tpl/home.php @@ -10,7 +10,7 @@ - +