# 4. Find the contour-point nearest to another point

One aspect we can consider when generating a design to plot is this: do previously added lines and curves influence the properties of the line or curve I will add next?

Personally I find it most interesting when curves interact with other curves, when lines start or end at other lines, or cross them at specified locations or angles, or when something happens at the intersections of lines.

OPENRNDR offers many tools (methods) to help with this. We can query distances, intersections, normals, we can offset curves, create sub-curves, sample them at various locations and much more.

In this post I will just mention one of such tools: `ShapeContour.nearest(point: Vector2)`. With it we can ask: what point in this contour is the closest to this other point?

``````import org.openrndr.application
import org.openrndr.color.ColorRGBa
import org.openrndr.shape.Circle
import org.openrndr.shape.LineSegment

fun main() {
application {
program {
// create two nested circles positioned relative to the canvas
// Circle is a "mathematical circle" (a data type)
//  `.contour` converts it into a drawable one.
val c1 = Circle(drawer.bounds.position(0.45, 0.45), 150.0).contour
val c2 = Circle(drawer.bounds.position(0.55, 0.55), 50.0).contour

// Create a list with 60 LineSegments. Each one connects
// a position sampled from the first circle with the nearest
// point in the second circle.
val lineCount = 60
val lines = List(lineCount) {
val a = c1.position(it / lineCount.toDouble()) // 0.0 .. 1.0
val b = c2.nearest(a).position
LineSegment(a, b)
}

extend {
drawer.apply { // make `this` = drawer
clear(ColorRGBa.WHITE)
fill = null
stroke = ColorRGBa.BLACK
contour(c1)
contour(c2)
lineSegments(lines)
}
}
}
}
}
``````

Another result using the same approach:

More about Shape, ShapeContour and Segment

1 Like