[orx-shapes] Add ContourAdjuster tests, fix bug in edge transform

This commit is contained in:
Edwin Jakobs
2023-12-07 18:02:34 +01:00
parent ab4c970ee0
commit 0b27dc735c
3 changed files with 104 additions and 4 deletions

View File

@@ -32,7 +32,7 @@ class ContourAdjuster(var contour: ShapeContour) {
/** /**
* selected vertex indices * selected vertex indices
*/ */
var vertexSelection = List(contour.segments.size + if (contour.closed) 1 else 0) { it } var vertexSelection = List(contour.segments.size + if (contour.closed) 0 else 1) { it }
/** /**
* selected edge indices * selected edge indices

View File

@@ -233,8 +233,10 @@ data class ContourEdge(
} else { } else {
refIn.cubic.control refIn.cubic.control
} }
if (control.isNotEmpty()) {
control[1] = control[1].transformedBy(transform) control[1] = control[1].transformedBy(transform)
newSegments[segmentInIndex] = refIn.copy(end = segment.start.transformedBy(transform), control = control) }
newSegments[segmentInIndex] = refIn.copy(end = segment.start.transformedBy(transform))
} }
if (refOut != null) { if (refOut != null) {
val control = if (refOut.linear || !updateTangents) { val control = if (refOut.linear || !updateTangents) {
@@ -242,7 +244,9 @@ data class ContourEdge(
} else { } else {
refOut.cubic.control refOut.cubic.control
} }
if (control.isNotEmpty()) {
control[0] = control[0].transformedBy(transform) control[0] = control[0].transformedBy(transform)
}
newSegments[segmentOutIndex] = refOut.copy(start = segment.end.transformedBy(transform)) newSegments[segmentOutIndex] = refOut.copy(start = segment.end.transformedBy(transform))
} }

View File

@@ -0,0 +1,96 @@
import org.openrndr.extra.shapes.adjust.adjustContour
import org.openrndr.math.Vector2
import org.openrndr.shape.LineSegment
import org.openrndr.shape.Rectangle
import kotlin.math.cos
import kotlin.math.sin
import kotlin.test.Test
import kotlin.test.assertEquals
class TestAdjustContour {
@Test
fun testSingleLinearSegment() {
val adjusted = adjustContour(LineSegment(0.0, 0.0, 100.0, 100.0).contour) {
selectVertex(0)
vertex.moveTo(Vector2(50.0, 50.0))
selectVertex(1)
vertex.moveTo(Vector2(150.0, 150.0))
}
assertEquals(1, adjusted.segments.size)
assertEquals(50.0, adjusted.segments[0].start.x, 1E-6)
assertEquals(50.0, adjusted.segments[0].start.y, 1E-6)
assertEquals(150.0, adjusted.segments[0].end.x, 1E-6)
assertEquals(150.0, adjusted.segments[0].end.y, 1E-6)
}
@Test
fun testSingleLinearSegmentDefaultVertexSelection() {
val adjusted = adjustContour(LineSegment(0.0, 0.0, 100.0, 100.0).contour) {
for (v in vertices) {
v.moveBy(Vector2(50.0, 50.0))
}
}
assertEquals(1, adjusted.segments.size)
assertEquals(50.0, adjusted.segments[0].start.x, 1E-6)
assertEquals(50.0, adjusted.segments[0].start.y, 1E-6)
assertEquals(150.0, adjusted.segments[0].end.x, 1E-6)
assertEquals(150.0, adjusted.segments[0].end.y, 1E-6)
}
@Test
fun testSingleLinearSegmentDefaultEdgeSelection() {
val adjusted = adjustContour(LineSegment(0.0, 0.0, 100.0, 100.0).contour) {
for (e in edges) {
e.moveBy(Vector2(50.0, 50.0))
}
}
assertEquals(1, adjusted.segments.size)
assertEquals(50.0, adjusted.segments[0].start.x, 1E-6)
assertEquals(50.0, adjusted.segments[0].start.y, 1E-6)
assertEquals(150.0, adjusted.segments[0].end.x, 1E-6)
assertEquals(150.0, adjusted.segments[0].end.y, 1E-6)
}
@Test
fun testSingleQuadraticSegment() {
val adjusted = adjustContour(LineSegment(0.0, 0.0, 100.0, 100.0).segment.quadratic.contour) {
selectVertex(0)
vertex.moveTo(Vector2(50.0, 50.0))
selectVertex(1)
vertex.moveTo(Vector2(150.0, 150.0))
}
assertEquals(1, adjusted.segments.size)
assertEquals(50.0, adjusted.segments[0].start.x, 1E-6)
assertEquals(50.0, adjusted.segments[0].start.y, 1E-6)
assertEquals(150.0, adjusted.segments[0].end.x, 1E-6)
assertEquals(150.0, adjusted.segments[0].end.y, 1E-6)
}
@Test
fun testEdgeTransform() {
val adjusted = adjustContour(LineSegment(0.0, 0.0, 100.0, 100.0).segment.quadratic.contour) {
for (e in edges) {
e.moveBy(Vector2(50.0, 50.0))
}
}
}
@Test
fun testRectangleEdgeTransform() {
var r = Rectangle(0.0, 0.0, 400.0, 400.0).contour
val seconds = 0.0
r = adjustContour(r) {
selectEdge(1)
for (edge in edges) {
edge.moveBy(Vector2(sin(seconds) * 10.0, cos(seconds) * 5.0))
}
}
}
}