JoinedCurve[{segment1,segment2,…}]
represents a curve consisting of segment1 followed by segment2 etc.
JoinedCurve[{component1,component2,…}]
represents a list of separate component curves component1, component2, etc.
JoinedCurve
JoinedCurve[{segment1,segment2,…}]
represents a curve consisting of segment1 followed by segment2 etc.
JoinedCurve[{component1,component2,…}]
represents a list of separate component curves component1, component2, etc.
Details and Options
- JoinedCurve can be used in Graphics (two-dimensional graphics).
- JoinedCurve[segment] is equivalent to JoinedCurve[{segment}].
- Possible forms of segmenti include:
-
Line[{pt1,pt2,…}] lines BezierCurve[{pt1,pt2,…},…] Bézier curve BSplineCurve[{pt1,pt2,…},…] B-spline curve - The first point on segmenti is taken to be the last point on segmenti-1. JoinedCurve[{pr1[{p1,…,pi}],pr2[{q1,…,qj}],…}] is equivalent to JoinedCurve[{pr1[{p1,…,pi}],pr2[{pi,q1,…,qj}],…}].
- The setting JoinedCurve[{component1,component2,…},CurveClosed->{close1,close2,…}] specifies whether individual component curves should be closed.
- JoinedCurve[{component1,…},CurveClosed->close] indicates that all component curves should be closed.
- The coordinates can be specified using:
-
{x,y} ordinary coordinates Scaled[{x,y}] scaled coordinates ImageScaled[{x,y}] image-scaled coordinates Offset[{dx,dy},{x,y}] absolute offset coordinates - Individual coordinates and lists of coordinates in segments can be Dynamic objects.
- Curve thickness can be specified using Thickness or AbsoluteThickness, as well as Thick, Thin, etc.
- Curve dashing can be specified using Dashing or AbsoluteDashing, as well as Dashed, Dotted, etc.
- Curve coloring and transparency can be specified using CMYKColor, GrayLevel, Hue, Opacity, or RGBColor.
- Joining of curve segments can be specified using JoinForm.
- Curve caps can be specified using CapForm.
- VertexColors and VertexNormals options to Line will have no effect within a JoinedCurve construct.
Examples
open all close allBasic Examples (4)
Curve with mixed curve segments:
a = {{-1, 0}, {0, 1}, {1, 0}};b = {{0, -(2/3)}, {-1, 0}};Graphics[JoinedCurve[{BezierCurve[a], Line[b]}]]Curve with two curve components:
pts = {{-1, -1 / 2}, {0, 1}, {1, -1 / 2}};Graphics[JoinedCurve[{{Line[2pts]}, {Line[pts]}}]]Curve with two closed components:
Graphics[JoinedCurve[{{Line[2pts]}, {Line[pts]}}, CurveClosed -> True]]a = {{-1, 0}, {0, 1}, {1, 0}};b = {{0, -(2/3)}, {-1, 0}};curve = JoinedCurve[{{BezierCurve[2a], Line[2b]}, {BezierCurve[a], Line[b]}}];{Graphics[{Dashed, curve}], Graphics[{Pink, curve}], Graphics[{Thick, curve}], Graphics[{Thick, Dashed, Pink, curve}]}Graphics[{Arrowheads[{-0.1, 0.1}], Arrow[JoinedCurve[{Line[{{0, 0}, {1, 0}}], BezierCurve[{{2, 0}, {2, 1}}]}]]}]Scope (18)
Graphics (12)
Specification (3)
Curve with a single open line segment:
Graphics[JoinedCurve[Line[{{-1, 0}, {-1, 1}, {0, 2}, {1, 1}, {1, 0}}]]]Curve with a single closed line segment:
Graphics[JoinedCurve[Line[{{-1, 0}, {-1, 1}, {0, 2}, {1, 1}, {1, 0}}], CurveClosed -> True]]Curve with a single open Bézier curve segment:
Graphics[JoinedCurve[BezierCurve[{{-1, 0}, {-1, 2}, {1, 2}, {1, 0}}]]]Curve with a single closed Bézier curve segment:
Graphics[JoinedCurve[BezierCurve[{{-1, 0}, {-1, 2}, {1, 2}, {1, 0}}], CurveClosed -> True]]Curve with a single open B-spline curve segment:
Graphics[JoinedCurve[BSplineCurve[{{-1, 0}, {-1, 1}, {0, 0}, {1, 1}, {1, 0}}]]]Curve with a single closed B-spline curve segment:
Graphics[JoinedCurve[BSplineCurve[{{-1, 0}, {-1, 1}, {0, 0}, {1, 1}, {1, 0}}], CurveClosed -> True]]Curve with mixed curve segments:
Graphics[JoinedCurve[{BSplineCurve[{{-2, 0}, {-1, 1}, {0, -1}, {1, 1}, {2, 0}}], Line[{{2, -1}, {-2, -1}}]}, CurveClosed -> True]]Curve with two curve components:
Graphics[JoinedCurve[{{Line[{{-2, 0}, {-2, 2}, {0, 4}, {2, 2}, {2, 0}}]}, {Line[{{-1, 1}, {-1, 2}, {0, 3}, {1, 2}, {1, 1}}]}}, CurveClosed -> True]]Curve with multiple curve components:
pts = {{-(Sqrt[3]/2), -(1/2)}, {0, 1}, {(Sqrt[3]/2), -(1/2)}};Graphics[JoinedCurve[{{BezierCurve[3pts]}, { Line[2pts]}, {BezierCurve[pts]}}, CurveClosed -> True]]Styling (6)
Curves with different thicknesses:
Table[Graphics[{Thickness[i], JoinedCurve[{{BSplineCurve[{{-2, 0}, {-2, 2}, {0, 4}, {2, 2}, {2, 0}}]}, {BSplineCurve[{{-1, 1}, {-1, 2}, {0, 3}, {1, 2}, {1, 1}}]}}, CurveClosed -> True]}], {i, {.005, .025, .05}}]Table[Graphics[{d, JoinedCurve[{{BSplineCurve[{{-2, 0}, {-2, 2}, {0, 4}, {2, 2}, {2, 0}}]}, {BSplineCurve[{{-1, 1}, {-1, 2}, {0, 3}, {1, 2}, {1, 1}}]}}, CurveClosed -> True]}], {d, {Dotted, Dashed, DotDashed}}]Color directives specify the line colors of curves:
Table[Graphics[{c, JoinedCurve[{{BSplineCurve[{{-2, 0}, {-2, 2}, {0, 4}, {2, 2}, {2, 0}}]}, {BSplineCurve[{{-1, 1}, {-1, 2}, {0, 3}, {1, 2}, {1, 1}}]}}, CurveClosed -> True]}], {c, {Red, Green, Blue, Orange}}]CapForm can be used to specify line caps of each curve component:
Table[Graphics[{CapForm[cap], Thickness[.1], JoinedCurve[{{BSplineCurve[{{-2, 0}, {-2, 2}, {0, 4}, {2, 2}, {2, 0}}]}, {BSplineCurve[{{-1, 1}, {-1, 2}, {0, 3}, {1, 2}, {1, 1}}]}}]}, PlotLabel -> cap], {cap, {"Butt", "Round", "Square"}}]JoinForm can be used to specify the type of joins for line segments:
a = {{-2, 0}, {0, 2}, {2, 0}, {0, -2}};curve = JoinedCurve[{{Line[2a]}, {Line[a]}}];{Graphics[{JoinForm["Bevel"], Thickness[0.07], curve}, PlotRange -> 5], Graphics[{JoinForm["Meter"], Thickness[0.07], curve}, PlotRange -> 5]Graphics[{JoinForm["Round"], Thickness[0.07], curve}, PlotRange -> 5]}Arrow can wrap curves around to create curved arrows:
Graphics[{Arrowheads[Large], Arrow[JoinedCurve[{{BSplineCurve[{{-2, 0}, {-2, 2}, {0, 4}, {2, 2}, {2, 0}}]}, {BSplineCurve[{{-1, 1}, {-1, 2}, {0, 3}, {1, 2}, {1, 1}}]}}]]}]Coordinates (3)
Use Scaled coordinates:
Graphics[JoinedCurve[BezierCurve[{Scaled[{0, 0}], Scaled[{.5, 1}], Scaled[{1, 0}]}]], Frame -> True]Use ImageScaled coordinates:
Graphics[JoinedCurve[BezierCurve[{ImageScaled[{0, 0}], ImageScaled[{.5, 1}], ImageScaled[{1, 0}]}]], Frame -> True]Use Offset coordinates:
Graphics[JoinedCurve[BezierCurve[{Offset[{10, 10}, {0, 0}], Offset[{0, 50}, {.5, 1}], Offset[{-10, 10}, {1, 0}]}]], Frame -> True]Regions (6)
RegionEmbeddingDimension[JoinedCurve[{BSplineCurve[{{Subscript[c, 1], Subscript[c, 2]}, {Subscript[c, 3], Subscript[c, 4]}, {Subscript[c, 5], Subscript[c, 6]}}]}]]RegionDimension[JoinedCurve[{BSplineCurve[{{Subscript[c, 1], Subscript[c, 2]}, {Subscript[c, 3], Subscript[c, 4]}, {Subscript[c, 5], Subscript[c, 6]}}]}]]{RegionMember[JoinedCurve[{BezierCurve[{{-1, 0}, {0, 1}, {1, 0}}], Line[{{0, -(2/3)}, {-1, 0}}]}], {1, 0}], RegionMember[JoinedCurve[{BezierCurve[{{-1, 0}, {0, 1}, {1, 0}}], Line[{{0, -(2/3)}, {-1, 0}}]}], {1, 2}]}ℛ = JoinedCurve[{BezierCurve[{{-1, 0}, {0, 1}, {1, 0}}], Line[{{0, -(2/3)}, {-1, 0}}]}];{ArcLength[ℛ], RegionMeasure[ℛ]}c = RegionCentroid[ℛ]Graphics[{{Gray, ℛ}, {Red, Point[c]}}]ℛ = JoinedCurve[{BezierCurve[{{-1, 0}, {0, 1}, {1, 0}}], Line[{{0, -(2/3)}, {-1, 0}}]}];{RegionDistance[ℛ, {1, 1}], RegionDistance[ℛ, {0, 0}]}The distance to the nearest point for the joined curve:
{Plot3D[Evaluate@RegionDistance[ℛ, {x, y}], {x, -2, 2}, {y, -2, 2}, MeshFunctions -> {#3&}, Mesh -> 5, Exclusions -> Norm[{x, y}] == 1], ContourPlot[Evaluate@RegionDistance[ℛ, {x, y}], {x, -3, 4}, {y, -3, 3}, Contours -> {{0.5, Red}, {1, Green}, {1.5, Blue}}]}ℛ = JoinedCurve[{BezierCurve[{{-1, 0}, {0, 1}, {1, 0}}], Line[{{0, -(2/3)}, {-1, 0}}]}];{SignedRegionDistance[ℛ, {1, 0}], SignedRegionDistance[ℛ, {0, 0}]}Signed distance to the joined curve:
Plot3D[SignedRegionDistance[ℛ, {x, y}], {x, -2, 2}, {y, -2, 2}, Exclusions -> Norm[{x, y}] == 1, Mesh -> None]ℛ = JoinedCurve[{BezierCurve[{{-1, 0}, {0, 1}, {1, 0}}], Line[{{0, -(2/3)}, {-1, 0}}]}];BoundedRegionQ[ℛ]rr = RegionBounds[ℛ]Graphics[{{EdgeForm[Directive[Dashed, Red]], Opacity[0.1], Yellow, Rectangle@@Transpose[rr]}, ℛ}]Options (1)
CurveClosed (1)
Curve with a single open Bézier curve segment:
Graphics[JoinedCurve[BezierCurve[{{-1, 0}, {-1, 2}, {1, 2}, {1, 0}}]]]Curve with a single closed Bézier curve segment:
Graphics[JoinedCurve[BezierCurve[{{-1, 0}, {-1, 2}, {1, 2}, {1, 0}}], CurveClosed -> True]]Specify whether each component is closed individually:
Graphics[JoinedCurve[{{Line[{{-2, 0}, {-2, 2}, {0, 4}, {2, 2}, {2, 0}}]}, {BSplineCurve[{{-1, 1}, {-1, 2}, {0, 3}, {1, 2}, {1, 1}}]}}, CurveClosed -> {True, False}]]Applications (2)
Define a font outline with a curve:
a = JoinedCurve[{{Line[{{2, 3}, {0.8125, 0.625}}],
BezierCurve[{{0.6875, 0.375}, {0.375, 0.25}, {1.125, 0.25}}, SplineDegree -> 2], BezierCurve[{{0.8125, 0.375}, {0.9375, 0.625}}],
Line[{{1.3125, 1.375}, {2.4375, 1.375}, {2.8125, 0.625}}],
BezierCurve[{{2.9375, 0.375}, {2.625, 0.25}, {3.625, 0.25}}, SplineDegree -> 2], BezierCurve[{{3.3125, 0.375}, {3.1875, 0.625}}]},
{Line[{{1.875, 2.5}, {1.375, 1.5}, {2.375, 1.5}}]}}, CurveClosed -> True];Graphics[a]Extract a curve outline from a glyph:
g = First[[image]] /. FilledCurve[a__] :> JoinedCurve[a];Head[g]Rotate the glyph around the origin:
Graphics[{Thick,
Table[{Hue[(t/2 π)], Rotate[g, t, {0, 0}]}, {t, 0, 2 π, (π/6)}]}]Properties & Relations (1)
Create a circular path using B-spline curves:
pts = {{0., -0.5}, {0.5, -0.5}, {0.5, 0.5}, {0., 0.5}, {-0.5, 0.5}, {-0.5, -0.5}, {0., -0.5}};
w = {1, .5, .5, 1, .5, .5, 1};
k = {0, 0, 0, 1 / 4, 1 / 2, 1 / 2, 3 / 4, 1, 1, 1};
path = {{BSplineCurve[2pts, SplineDegree -> 2, SplineKnots -> k, SplineWeights -> w]}, {BSplineCurve[pts, SplineDegree -> 2, SplineKnots -> k, SplineWeights -> w]}};Use Arrow with curves to create curved arrows:
Graphics[{Arrow[JoinedCurve[path]]}]Use Arrowheads to specify properties of arrowheads:
Graphics[{Arrowheads[Table[{RandomReal[{0.05, 0.1}], i}, {i, 0.1, 1, 0.1}]], Arrow[JoinedCurve[path]]}]Combine with FilledCurve to get a shape with curved arrow boundaries:
Graphics[{EdgeForm[], FaceForm[Pink], FilledCurve[path], Arrowheads[Table[{RandomReal[{0.05, 0.1}], i}, {i, 0.1, 1, 0.1}]], Arrow[JoinedCurve[path]]}]Neat Examples (2)
Module[{a = JoinedCurve[{{Line[{{2, 3}, {0.8125, 0.625}}],
BezierCurve[{{0.6875, 0.375}, {0.375, 0.25}, {1.125, 0.25}}, SplineDegree -> 2], BezierCurve[{{0.8125, 0.375}, {0.9375, 0.625}}],
Line[{{1.3125, 1.375}, {2.4375, 1.375}, {2.8125, 0.625}}],
BezierCurve[{{2.9375, 0.375}, {2.625, 0.25}, {3.625, 0.25}}, SplineDegree -> 2], BezierCurve[{{3.3125, 0.375}, {3.1875, 0.625}}]},
{Line[{{1.875, 2.5}, {1.375, 1.5}, {2.375, 1.5}}]}}, CurveClosed -> True]}, Graphics[Table[{Thick, Hue[RandomReal[]], Translate[Rotate[Scale[a, RandomReal[5]], RandomReal[2Pi]], RandomReal[20, {2}]]}, {30}]]]DynamicModule[{curve = First[First[
ImportString[ExportString[Style["M8", FontFamily -> "Times", FontSize -> 72], "PDF"], {"PDF", "PageGraphics"}, "TextOutlines" -> True]]] /.
{Thickness[_] :> {},
FilledCurve[args__] :> {FaceForm[ColorData["HTML", "Crimson"]], FilledCurve[args], Dashed, Arrow[JoinedCurve[args, CurveClosed -> True]]}}},
Animate[Graphics[{
Arrowheads[{{0.05, t}, {0.05, Mod[t + (1/3), 1]}, {0.05, Mod[t + (2/3), 1]}}], curve}], {t, 0, 1}, SaveDefinitions -> True, AnimationRunning -> False]]See Also
Related Guides
History
Text
Wolfram Research (2010), JoinedCurve, Wolfram Language function, https://reference.wolfram.com/language/ref/JoinedCurve.html.
CMS
Wolfram Language. 2010. "JoinedCurve." Wolfram Language & System Documentation Center. Wolfram Research. https://reference.wolfram.com/language/ref/JoinedCurve.html.
APA
Wolfram Language. (2010). JoinedCurve. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/JoinedCurve.html
BibTeX
@misc{reference.wolfram_2026_joinedcurve, author="Wolfram Research", title="{JoinedCurve}", year="2010", howpublished="\url{https://reference.wolfram.com/language/ref/JoinedCurve.html}", note=[Accessed: 12-June-2026]}
BibLaTeX
@online{reference.wolfram_2026_joinedcurve, organization={Wolfram Research}, title={JoinedCurve}, year={2010}, url={https://reference.wolfram.com/language/ref/JoinedCurve.html}, note=[Accessed: 12-June-2026]}