Path (クラス)
public final Path
インポート元: CURL.GUI.STANDARD. package 内で定義されています CURL.GRAPHICS._2D.REGION.

(接続されていない場合も含む)無限に細い、方向性を持った 2 次元の曲線として Distance2d および PathOperation で定義されています。

説明

パスを形成するいくつかの方法があります。パスは、パス操作と端点によって記述された、端と端とをつなぐパス セグメントで構成されています。PathOperation.move-to 操作によって示されるパス セグメントは、パス内の切れ目 (すき間) を指定します。曲線セグメントを定義するパス操作は、補助的なコントロール点を必要とします。

Path は、以下の方法で形成できます。

プログラミング注意事項

Path は開始ポイントおよび後に続く一連の PathOperation とポイントで構成されます。 3 つの使用可能な PathOperation は、PathOperation.move-to、PathOperation.line-to、PathOperation.curve-to です。

次のイメージは、9 つのポイント (赤い番号の付いた円) と 4 つの PathOperation で表示された Path (細い黒い線) を表しています。



ポイント 0 は Path の始まりです。最初の PathOperation は前のポイント (0) を使用する PathOperation.line-to と、線セグメントを表示する 1 つの追加ポイント (1) です。

2 番目の PathOperation は前のポイント (1) を使用する PathOperation .curve-to と、3 次元ベジエ曲線を表示する 3 つの追加ポイント (2-4) です。前のポイント (1) と 3 番目のポイント (4) は端点で、曲線は中間の 2 つのポイント (2 および 3) の影響を受けます。

3 番目の PathOperationPathOperation.move-to で、追加ポイント (5) を使用して Path にブレークを表示します。Path はこのポイントから続行できます。

次のコードは Distance2d および PathOperationPath コンストラクタに渡すことによって Path を指定します。


例: Path の作成
{define-class ExampleGraphic
  {inherits Fill}

  {constructor {default ...}
    {construct-super ...}
  }

  {method public {draw renderer2d:Renderer2d}:void
    let bounds:GRect = {self.layout.get-bounds}
    {with-render-properties
        || make the top-left of the Fill the origin
        translation = {Distance2d -bounds.lextent, -bounds.ascent}
        on renderer2d do
        
        || Here's the Path we're building:
        let path:Path =
            {Path 
                {Distance2d 0.5in, 0.3in},
                PathOperation.line-to,
                {Distance2d 2in, 1.5in},
                PathOperation.move-to,
                {Distance2d 2in, 1.9in},
                PathOperation.curve-to,
                {Distance2d 3in, 1.7in},
                {Distance2d 3in, 0.7in},
                {Distance2d 2in, 0.2in}
            }

        {renderer2d.render-path
            path,
            fill-pattern = {FillPattern.get-cyan}
        }
    }
  }
}

{ExampleGraphic
    width = 4in,
    height = 2in,
    background = {FillPattern.get-gray}
}

コンストラクタ
default:Path を初期化します。
コンストラクタ public {Path.default ...:any}

プロパティ
closed?:self が閉じたループの場合は true を、それ以外は false を返します。
アクセサ public Path.closed?:bool
empty?:Pathempty? アクセッサは、ポイントのない Path について true を返します。
アクセサ public inline Path.empty?:bool
first-point:Path の最初のポイントを返します。
アクセサ public Path.first-point:Distance2d
for-loop-count:Path.get および Path.for-loop-count の使い方の説明については、Path.get の説明を参照してください。
アクセサ public Path.for-loop-count:int
has-curve-segments?:この Path 内に曲線が存在する場合、true を返します。
フィールド public-get private-set Path.has-curve-segments?:bool =false
last-point:この Path にある最後のポイントを返します。
アクセサ public Path.last-point:Distance2d
num-edges:この Path 内にあるエッジの数を返します。
アクセサ public Path.num-edges:int
num-points:この Path 内にあるポイントの数を返します。
アクセサ public Path.num-points:int

メソッド
append:other から self にパスを追加します。other の最初のポイントが self の最後のポイントの tolerance 内にある場合、そのポイントは同じものとみなされ、それ以外の場合はパスは開いた状態になります。tolerance を 0 に設定して強制的に開いた状態にします。
public {Path.append other:Path, tolerance:Distance = 0.00000001mm}:void
arc-to:楕円弧のセグメントを Path に追加します。
public final {Path.arc-to
x-radius:Distance,
y-radius:Distance,
x-axis-rotation:Angle,
large-arc?:bool,
sweep-clockwise?:bool,
end:Distance2d,
max-angle:Angle = 45deg
}:void
arc-to-relative:前の端点と相対的に楕円弧のセグメントを Path に追加します。
public final {Path.arc-to-relative
x-radius:Distance,
y-radius:Distance,
x-axis-rotation:Angle,
large-arc?:bool,
sweep-clockwise?:bool,
end-delta:Distance2d,
max-angle:Angle = 45deg
}:void
clear:このメソッドは、その内部データすべての Path を空にして、空の状態に設定します。
public {Path.clear}:void
clone:この Path のコピーである新しい Path を返します。
public {Path.clone}:Path
close:PathOperation.line-toPathOperation.move-to の直前に挿入することにより、この Path を閉じます。こうして閉じてない開いたセクションを閉じます。
public {Path.close close-all-disjoint-sections?:bool = true}:void
curve-to:3 つの Distance2d を取り 3 次元ベジエ曲線を追加します self にベジエ曲線を追加します。
public {Path.curve-to
control-point1:Distance2d,
control-point2:Distance2d,
end-point:Distance2d
}:void
curve-to-relative:前の端点と相対的な 3 次元ベジエ曲線を追加します。
public final {Path.curve-to-relative
control-point1-delta:Distance2d,
control-point2-delta:Distance2d,
end-point-delta:Distance2d
}:void
get:メソッド get およびアクセッサ for-loop-count により、for ループを使って Path を繰り返すことができます。
public {Path.get
index:int
}:(a:Distance2d, op:PathOperation, b:Distance2d, control-point-1:Distance2d, control-point-2:Distance2d)
get-bounding-box:この Path の境界点を計算し返します。
public {Path.get-bounding-box
}:(x:Distance, y:Distance, width:Distance, height:Distance)
get-intersections:線セグメントが Path と交差するポイントを計算します。
public {Path.get-intersections
start:Distance2d,
end:Distance2d,
intersections:{Array-of Distance2d},
up?:{Array-of bool}
}:void
line-to:線セグメントを Path に追加します。
public {Path.line-to point:Distance2d}:void
line-to-relative:線セグメントを Path に追加します。
public final {Path.line-to-relative delta:Distance2d}:void
move-to:Path にブレークを作成します。
public {Path.move-to point:Distance2d}:void
move-to-relative:Path にブレークを作成します。
public final {Path.move-to-relative delta:Distance2d}:void
quadratic-curve-to:前の端点から新しい端点まで 2 次元のベジエ曲線を追加します。
public final {Path.quadratic-curve-to
control-point:Distance2d,
end-point:Distance2d
}:void
quadratic-curve-to-relative:前の端点から新しい端点まで 2 次元のベジエ曲線を追加します。
public final {Path.quadratic-curve-to-relative
control-point-delta:Distance2d,
end-point-delta:Distance2d
}:void
smooth-curve-to:前の端点から新しい端点まで 3 次元のベジエ曲線を追加し、2 つの曲線をスムーズに結合します。
public final {Path.smooth-curve-to
control-point2:Distance2d,
end-point:Distance2d
}:void
smooth-curve-to-relative:前の端点から新しい端点まで 3 次元のベジエ曲線を追加し、2 つの曲線をスムーズに結合します。
public final {Path.smooth-curve-to-relative
control-point2-delta:Distance2d,
end-point-delta:Distance2d
}:void
smooth-quadratic-curve-to:前の端点から新しい端点まで 2 次元のベジエ曲線を追加し、2 つの曲線をスムーズに結合します。
public final {Path.smooth-quadratic-curve-to end-point:Distance2d}:void
smooth-quadratic-curve-to-relative:前の端点から新しい端点まで 2 次元のベジエ曲線を追加し、2 つの曲線をスムーズに結合します。
public final {Path.smooth-quadratic-curve-to-relative
end-point-delta:Distance2d
}:void
to-Iterator:この Path の各要素をイテレートすることができるオブジェクトを返します。
public {Path.to-Iterator}:{Iterator-of PathIteratorItem}
to-line-segment-path:この Path を、線および移動セグメントだけで構成されたパスに近似させて分解します。常に新しい Path を返します。
public {Path.to-line-segment-path
max-angle:Angle = 10degrees,
out:#Path = null
}:Path
to-regions:パスの中心の回りに太いラインを形成する一連の領域を作成します。
public {Path.to-regions
thickness:Distance,
overlap-ok?:bool = false
}:{Array-of Region}
to-source-code:この Path のコピーを表示する Curl ソース コードを含む String を返します。
public {Path.to-source-code}:String
transform-clone:transformationPath を変換し、変換した Path を返します。
public {Path.transform-clone
transformation:Transformation2d,
out:#Path = null
}:Path
メソッド 継承 Object: object-describe, object-describe-for-debugging, object-serialize



コンストラクタ詳細
default (コンストラクタ)
public {Path.default ...:any}

Path を初期化します。

説明

次の項目のひとつを残余引数として指定する必要があります。

注意事項

Path コンストラクタは、パスの書式が正しくない場合エラーをスローします。



プロパティ詳細
closed? (アクセサ)
アクセサ public Path.closed?:bool

self が閉じたループの場合は true を、それ以外は false を返します。



empty? (アクセサ)
アクセサ public inline Path.empty?:bool

Pathempty? アクセッサは、ポイントのない Path について true を返します。

注意事項

Distance2d を 1 つだけ含む Path は、有効な、空でない Path です。そのような場合には、Path.empty? は false になります。


first-point (アクセサ)
アクセサ public Path.first-point:Distance2d

Path の最初のポイントを返します。

説明

Path.move-to またはコンストラクタのいずれかを介して Path に追加された最初のポインタは、Path の開始とみなされます。


for-loop-count (アクセサ)
アクセサ public Path.for-loop-count:int

Path.get および Path.for-loop-count の使い方の説明については、Path.get の説明を参照してください。



has-curve-segments? (フィールド)
public-get private-set Path.has-curve-segments?:bool =false

この Path 内に曲線が存在する場合、true を返します。



last-point (アクセサ)
アクセサ public Path.last-point:Distance2d

この Path にある最後のポイントを返します。

注意事項

Path の最後のポイントは、呼び出し元で追加された最後のものであることも、そうでないこともあります。 Path.close がこの Path 上で使用された場合、追加のポイントが挿入されていることがあります。

Path に曲線セグメントがある場合、レンダリング操作は線セグメントのある曲線を近似することにより Path をフラット化することができます。この場合、Path.last-point はクライアント コードで追加された最後のポイントを返さないことがあります。

Path にポイントが含まれていない場合、Path.last-point{Distance2d 0m, 0m} を返します。


num-edges (アクセサ)
アクセサ public Path.num-edges:int

この Path 内にあるエッジの数を返します。

説明

この Path 内にある各 PathOperation は 1 つのエッジとしてカウントします。PathOperation.move-toPathOperation.line-to および PathOperation.curve-to が含まれています。


num-points (アクセサ)
アクセサ public Path.num-points:int

この Path 内にあるポイントの数を返します。

説明

Path 内にあるポイントの数は、通常、エッジの数に 1 を足したものです。

Path が閉じている場合、始点はポイントの Path リストの始めと終わりに表示されます。

PathPathOperation.curve-to エッジが含まれている場合、曲線の端点のみがカウントされます。ベジエ コントロール ポイントは、この場合カウントされません。





メソッド詳細
append (メソッド)
public {Path.append other:Path, tolerance:Distance = 0.00000001mm}:void

other から self にパスを追加します。other の最初のポイントが self の最後のポイントの tolerance 内にある場合、そのポイントは同じものとみなされ、それ以外の場合はパスは開いた状態になります。tolerance を 0 に設定して強制的に開いた状態にします。



arc-to (メソッド)
public final {Path.arc-to
x-radius:Distance,
y-radius:Distance,
x-axis-rotation:Angle,
large-arc?:bool,
sweep-clockwise?:bool,
end:Distance2d,
max-angle:Angle = 45deg
}:void

楕円弧のセグメントを Path に追加します。

x-radius: 弧が付属している楕円の水平方向の半径。楕円を定義する半径が小さすぎて前の端点と新しい端点のいずれにも触れることができない場合、必要に応じて楕円が拡大されます。
y-radius: 弧が付属している楕円の垂直方向の半径。楕円を定義する半径が小さすぎて前の端点と新しい端点のいずれにも触れることができない場合、必要に応じて楕円が拡大されます。
x-axis-rotation: 楕円の X 軸と座標系の X 軸の間の角度。
large-arc?: true の場合、楕円の大きい方の弧がスイープされます。false の場合、楕円の小さい方の弧がスイープされます。
sweep-clockwise?: true の場合、前の端点から新しい端点に向かって時計回りの方向に弧がスイープされます。false の場合、弧は反時計回りの方向でスイープされます。
end: 孤の端点。これが孤の開始点、つまり前の Path セグメントの終了点と同じでない場合があります。
max-angle: 弧は max-angle 度までカバーするベジエ曲線に再分割されます。一般に、既定の 45 度は妥当な値ですが、非常に正確な弧を描いたり高度に中心が偏っている楕円の場合は、より小さな値が望ましいことがあります。

注意事項

任意の 2 つのポイントが与えられると、それらのポイントで 2 つのオーバーラップする楕円が定義されます。large-arc? および sweep-clockwise? フラグは、このメソッドがどの楕円のどのセグメントを表示するのかを示します。

X または Y の半径のいずれかがゼロの場合、前の端点と新しい端点の間には弧の代わりに直線が引かれます。

楕円形の弧はベジエ曲線を使用して近似しています。max-angle 引数は各曲線ごとに弧を近似させる度合いを決定します。

次の例では、arc-to 操作による Path を 示します。


例: arc-to 操作
{import * from PATH-DOC, location = "../docstring-support/gfx/Path-doc.scurl"}
{value
    let start-point:Distance2d = {Distance2d 150pt, 200pt}
    let end-point:Distance2d = {Distance2d 450pt, 200pt}

    let path:Path = {Path}
    {path.move-to start-point}
    {path.arc-to 150pt, 100pt, 0deg, false, true, end-point}

    || External Graphic used to help demonstrate the use
    || of Path operations by labeling points.
    {PathDocGraphic
        width = 6cm,
        height = 4cm,
        600pt,
        400pt,
        {proc {r:Renderer2d, doc:PathDocGraphic}:void
            {r.render-path path, fill-pattern = {FillPattern.get-red}, stroke-thickness = 2pt}

            {doc.end-point r, start-point}
            {doc.end-point r, end-point}
        }
    }
}


arc-to-relative (メソッド)
public final {Path.arc-to-relative
x-radius:Distance,
y-radius:Distance,
x-axis-rotation:Angle,
large-arc?:bool,
sweep-clockwise?:bool,
end-delta:Distance2d,
max-angle:Angle = 45deg
}:void

前の端点と相対的に楕円弧のセグメントを Path に追加します。

説明

このメソッドは、端点の場所が起点ではなく前の端点と相対的であると言う点で Path.arc-to とは異なります。
x-radius: 弧が付属している楕円の水平方向の半径。楕円を定義する半径が小さすぎて前の端点と新しい端点のいずれにも触れることができない場合、必要に応じて楕円が拡大されます。
y-radius: 弧が付属している楕円の垂直方向の半径。楕円を定義する半径が小さすぎて前の端点と新しい端点のいずれにも触れることができない場合、必要に応じて楕円が拡大されます。
x-axis-rotation: 楕円の X 軸と座標系の X 軸の間の角度。
large-arc?: true の場合、楕円の大きい方の弧がスイープされます。false の場合、楕円の小さい方の弧がスイープされます。
sweep-clockwise?: true の場合、前の端点から新しい端点に向かって時計回りの方向に弧がスイープされます。false の場合、弧は反時計回りの方向でスイープされます。
end-delta: 前の端点と相対的な、弧の端点です。
max-angle: 弧は max-angle 度までカバーするベジエ曲線に再分割されます。一般に、既定の 45 度は妥当な値ですが、非常に正確な弧を描いたり高度に中心が偏っている楕円の場合は、より小さな値が望ましいことがあります。

注意事項

任意の 2 つのポイントが与えられると、それらのポイントで 2 つのオーバーラップする楕円が定義されます。large-arc? および sweep-clockwise? フラグは、このメソッドがどの楕円のどのセグメントを表示するのかを示します。

X または Y の半径のいずれかがゼロの場合、前の端点と新しい端点の間には弧の代わりに直線が引かれます。

楕円形の弧はベジエ曲線を使用して近似しています。max-angle 引数は各曲線ごとに弧を近似させる度合いを決定します。

これは次と同じです。
{Path.arc-to
    radius,
    x-axis-rotation,
    large-arc?,
    sweep-clockwise?,
    end-delta + path.last-point,
    max-angle = max-angle
}

次の例では、arc-to-relative 操作による Path を示します。


例: arc-to-relative 操作
{import * from PATH-DOC, location = "../docstring-support/gfx/Path-doc.scurl"}
{value
    let start-point:Distance2d = {Distance2d 150pt, 200pt}
    let end-point-delta:Distance2d = {Distance2d 300pt, 0pt}

    let path:Path = {Path}
    {path.move-to start-point}
    {path.arc-to-relative 150pt, 100pt, 0deg, false, true, end-point-delta}

    || External Graphic used to help demonstrate the use
    || of Path operations by labeling points.
    {PathDocGraphic
        width = 6cm,
        height = 4cm,
        600pt,
        400pt,
        {proc {r:Renderer2d, doc:PathDocGraphic}:void
            {r.render-path path, fill-pattern = {FillPattern.get-red}, stroke-thickness = 2pt}

            {doc.end-point r, start-point}
            {doc.end-point r, end-point-delta + start-point}
        }
    }
}


clear (メソッド)
public {Path.clear}:void

このメソッドは、その内部データすべての Path を空にして、空の状態に設定します。

注意事項

この Path にあるすべての Distance2d および PathOperation は破棄されます。


clone (メソッド)
public {Path.clone}:Path

この Path のコピーである新しい Path を返します。



close (メソッド)
public {Path.close close-all-disjoint-sections?:bool = true}:void

PathOperation.line-toPathOperation.move-to の直前に挿入することにより、この Path を閉じます。こうして閉じてない開いたセクションを閉じます。

close-all-disjoint-sections?: true の場合(既定)、すべての開いたセクションが閉じられます。false の場合、最後の開いたセクションのみが閉じられます。

開いたPath 上で Path.close を呼び出した結果を表示するコードのブロックを示します。描画の前に閉じたパスが翻訳されるので、Path は開いたものと閉じたものの両方が表示されることに注意してください。


例: close 操作
{import * from PATH-DOC, location = "../docstring-support/gfx/Path-doc.scurl"}
{value
    let open-path:Path = {Path}
    {open-path.move-to {Distance2d 1cm, 1cm}}
    {open-path.line-to {Distance2d 1cm, 2cm}}
    {open-path.line-to {Distance2d 2cm, 2cm}}
    {open-path.line-to {Distance2d 2cm, 1cm}}

    let closed-path:Path = {open-path.clone}
    {closed-path.close}

    || External Graphic used to help demonstrate the use
    || of Path operations.
    {PathDocGraphic
        width = 5cm,
        height = 3cm,
        5cm,
        3cm,
        {proc {r:Renderer2d, doc:PathDocGraphic}:void
            {r.render-path open-path, fill-pattern = {FillPattern.get-red}, stroke-thickness = 2pt}

            {with-render-properties
                translation-x = 2cm
                on r do
                {r.render-path closed-path, fill-pattern = {FillPattern.get-blue}, stroke-thickness = 2pt}
            }
        }
    }
}


curve-to (メソッド)
public {Path.curve-to
control-point1:Distance2d,
control-point2:Distance2d,
end-point:Distance2d
}:void

3 つの Distance2d を取り 3 次元ベジエ曲線を追加します self にベジエ曲線を追加します。

control-point1: 2 つあるうちの最初のコントロール ポイントを使用して、曲線の形状を指定します。
control-point2: 2 つあるうちの 2 番目のコントロール ポイントを使用して、曲線の形状を指定します。
end-point: Distance2d は曲線の終了する場所を指定します。

注意事項

注意:ベジエ曲線を記述する式は、Foley と vanDam の共著 『Computer Graphics: Principles and Practice』などのコンピュータ グラフィックスのテキストに説明があります。

注意事項

このメソッドで作成される曲線は、PathOperation.curve-toPath コンストラクタに渡すことにより作成される曲線と同じです。例については、Path の既定のコンストラクタの説明を参照してください。

このメソッド Path.curve-toPathOperation.curve-to 操作の違いにより、Path.curve-to メソッドを使用すると Path を作成するときにすべてのポイントや操作を指定するのではなく Path を増加的に作成することができます。

次のコードは、curve-to 操作による Path を示します。


例: curve-to 操作
{import * from PATH-DOC, location = "../docstring-support/gfx/Path-doc.scurl"}
{value
    let start-point:Distance2d = {Distance2d 100pt, 50pt}
    let control-point1:Distance2d = {Distance2d 400pt, 50pt}
    let control-point2:Distance2d = {Distance2d 100pt, 250pt}
    let end-point:Distance2d = {Distance2d 400pt, 250pt}

    let path:Path = {Path}
    {path.move-to start-point}
    {path.curve-to
        control-point1,
        control-point2,
        end-point
    }

    || External Graphic used to help demonstrate the use
    || of Path operations by labeling points.
    {PathDocGraphic
        width = 5cm,
        height = 4cm,
        500pt,
        400pt,
        {proc {r:Renderer2d, doc:PathDocGraphic}:void
            {doc.line r, start-point, control-point1}
            {doc.line r, end-point, control-point2}

            {r.render-path path, fill-pattern = {FillPattern.get-red}, stroke-thickness = 2pt}

            {doc.end-point r, start-point}
            {doc.control-point r, control-point1}
            {doc.control-point r, control-point2}
            {doc.end-point r, end-point}
        }
    }
}


curve-to-relative (メソッド)
public final {Path.curve-to-relative
control-point1-delta:Distance2d,
control-point2-delta:Distance2d,
end-point-delta:Distance2d
}:void

前の端点と相対的な 3 次元ベジエ曲線を追加します。

control-point1-delta: 前の端点と相対的な、最初のコントロール ポイントです。
control-point2-delta: 前の端点と相対的な、2 番目のコントロール ポイントです。
end-point-delta: 前の端点と相対的な端点です。

注意事項

このメソッドは、端点とコントロール ポイントの場所が起点ではなく前の端点と相対的であると言う点で Path.curve-to とは異なります。

これは次と同じです。
{Path.curve-to
    control-point1-delta + path.last-point,
    control-point2-delta + path.last-point,
    end-point-delta + path.last-point
}

次の例では、curve-to-relative 操作による Path を示します。


例: curve-to-relative 操作
{import * from PATH-DOC, location = "../docstring-support/gfx/Path-doc.scurl"}
{value
    let start-point:Distance2d = {Distance2d 100pt, 50pt}
    let control-point1-delta:Distance2d = {Distance2d 300pt, 0pt}
    let control-point2-delta:Distance2d = {Distance2d 0pt, 200pt}
    let end-point-delta:Distance2d = {Distance2d 300pt, 200pt}

    let path:Path = {Path}
    {path.move-to start-point}
    {path.curve-to-relative
        control-point1-delta,
        control-point2-delta,
        end-point-delta
    }

    || External Graphic used to help demonstrate the use
    || of Path operations by labeling points.
    {PathDocGraphic
        width = 5cm,
        height = 4cm,
        500pt,
        400pt,
        {proc {r:Renderer2d, doc:PathDocGraphic}:void
            {doc.line r, start-point, control-point1-delta + start-point}
            {doc.line r, end-point-delta + start-point, control-point2-delta + start-point}

            {r.render-path path, fill-pattern = {FillPattern.get-red}, stroke-thickness = 2pt}

            {doc.end-point r, start-point}
            {doc.control-point r, control-point1-delta + start-point}
            {doc.control-point r, control-point2-delta + start-point}
            {doc.end-point r, end-point-delta + start-point}
        }
    }
}


get (メソッド)
public {Path.get
index:int
}:(a:Distance2d, op:PathOperation, b:Distance2d, control-point-1:Distance2d, control-point-2:Distance2d)

メソッド get およびアクセッサ for-loop-count により、for ループを使って Path を繰り返すことができます。

説明

Path.to-Iterator の使用は曲線の Path をイテレーションすることにとって有効的です。違いが小さく、非常に大きな Path のイテレーションの時だけ顕著だとしても、頻繁に小さな Path をイテレーションする場合に注意してください。
index: Path セグメントのインデックスを指定するゼロベースの整数です。

戻り値

次の 3 つの値が返されます。セグメント上の Distance2d、セグメントの型を表す PathOperation、および端点を指定する Distance2d です。

改訂

このメソッドは曲線の部分の制御点も返すために Curl 7.0 で拡張されました。制御点は通常指定された順序とは違う終了点の後に返されることに注意してください。(例えば、Path.default のコンストラクタ)

これは for ループを使用して Path をイテレートし Graphic にポイントを追加するコードの一部です。

例: get メソッド
{import * from CURL.GUI.SHAPES}
{let vbox:VBox = {VBox spacing = 12pt, font-size = .85em}}
{let path:Path = {Path}}
{do
    {path.move-to {Distance2d .5cm, 0cm}}
    {path.line-to {Distance2d 5cm, 1cm}}
    {path.line-to {Distance2d 4cm, 2cm}}
    {path.curve-to
        {Distance2d 3cm, 3cm},
        {Distance2d 0cm, 0cm},
        {Distance2d 1cm, 3cm}
    }
    {path.move-to {Distance2d 2cm, 2cm}}
    {vbox.add {PathShape path, stroke-thickness = 3pt}}
}
{for (point-0:Distance2d,
      op:PathOperation,
      point-1:Distance2d,
      control-point-1:Distance2d,
      control-point-2:Distance2d) 
    in path do
    {vbox.add
        {format
            "A point (%f, %f) with control points (%s, %s)",
            point-0.x, point-0.y, control-point-1, control-point-2
        }
    }
}
{value vbox}


get-bounding-box (メソッド)
public {Path.get-bounding-box
}:(x:Distance, y:Distance, width:Distance, height:Distance)

この Path の境界点を計算し返します。

説明

このメソッドはこのオブジェクトの正確な境界を算出します。つまり、いかなる特定の視覚表現も想定しておらず、代わりに現実に存在する座標データの境界を返します。
現在、パスの曲線の一部に関連する制御点は領域計算の目的のために頂点として扱われることに注意してください。結果として、領域の四角形はそのパスを包括していますが、曲線の Path のために可能な限りタイトな四角形の領域ではありません。
導入: バージョン 7.0


get-intersections (メソッド)
public {Path.get-intersections
start:Distance2d,
end:Distance2d,
intersections:{Array-of Distance2d},
up?:{Array-of bool}
}:void

線セグメントが Path と交差するポイントを計算します。

説明

Path.move-to または PathOperation.move-to によって作成される線セグメントとパス セグメントの交点は、結果に含まれません。
start: 線セグメントの開始点を表す Distance2d
end: 線セグメントの終点を表す Distance2d
intersections: {Array-of Distance2d} 呼び出し元が提供し、交点のセットに含まれます。
up?: {Array-of bool} 呼び出し元が提供し、交差している Path セグメントが上向きか下向きかを示すフラグを含みます。この配列には、前の説明のように intersections と同数の要素があります。up? 配列の各要素は同じ配列位置の交点に対応します。


line-to (メソッド)
public {Path.line-to point:Distance2d}:void

線セグメントを Path に追加します。

point: このパス セグメントの端点。

説明

Pathの最後のポイントで始まり指定したポイントで終了する線セグメントです。

注意事項

このメソッドで作成される線セグメントは、PathOperation.line-toPath コンストラクタに渡すことにより作成される曲線と同じです。例については、Path の既定のコンストラクタの説明を参照してください。

このメソッド Path.line-toPathOperation.line-to 操作の違いにより、Path.line-to メソッドを使用すると Path を作成するときにすべてのポイントや操作を指定するのではなく Path を増加的に作成することができます。


line-to-relative (メソッド)
public final {Path.line-to-relative delta:Distance2d}:void

線セグメントを Path に追加します。

delta: 前の端点から新しい端点までの距離です。

説明

Path の最後のポイントで始まり、そのポイントからの指定したオフセットで終了する線セグメントです。

注意事項

このメソッドは、端点の場所が起点ではなく前の端点と相対的であると言う点で Path.line-to とは異なります。

これは次と同じです。
{Path.line-to delta + path.last-point}

次の例では、line-to-relative 操作による Path を示します。


例: line-to-relative 操作
{import * from PATH-DOC, location = "../docstring-support/gfx/Path-doc.scurl"}
{value
    let start-point:Distance2d = {Distance2d 100pt, 100pt}
    let delta:Distance2d = {Distance2d 200pt, 100pt}

    let path:Path = {Path}
    {path.move-to start-point}
    {path.line-to-relative delta}

    || External Graphic used to help demonstrate the use
    || of Path operations by labeling points.
    {PathDocGraphic
        width = 5cm,
        height = 4cm,
        500pt,
        400pt,
        {proc {r:Renderer2d, doc:PathDocGraphic}:void
            {r.render-path path, fill-pattern = {FillPattern.get-red}, stroke-thickness = 2pt}

            {doc.end-point r, start-point}
            {doc.end-point r, delta + start-point}
        }
    }
}


move-to (メソッド)
public {Path.move-to point:Distance2d}:void

Path にブレークを作成します。

説明

point: このパスセグメントの端点。これは Path を続行する起点になる場所です。

注意事項

このメソッドから発生する移動は、PathOperation.move-toPath コンストラクタに渡すことにより作成される曲線と同じです。例については、Path の既定のコンストラクタの説明を参照してください。

このメソッド Path.move-toPathOperation.move-to 操作の違いにより、Path.move-to メソッドを使用すると Path を作成するときにすべてのポイントや操作を指定するのではなく Path を増加的に作成することができます。


move-to-relative (メソッド)
public final {Path.move-to-relative delta:Distance2d}:void

Path にブレークを作成します。

delta: 前の端点から新しい端点までの距離です。

注意事項

このメソッドは、端点の場所が起点ではなく前の端点と相対的であると言う点で Path.move-to とは異なります。

これがパスにおける最初の操作である場合、delta は、Path.move-to が呼び出されたかのように、起点に対して相対になります。

これは次と同じです。
{Path.move-to delta + path.last-point}


quadratic-curve-to (メソッド)
public final {Path.quadratic-curve-to
control-point:Distance2d,
end-point:Distance2d
}:void

前の端点から新しい端点まで 2 次元のベジエ曲線を追加します。

説明

このメソッドは、コントロール ポイントが 1 つだけであるという点で Path.curve-to と異なります。次の例を参照してください。
control-point: 曲線の形状を指定するために使用されるコントロールポイントです。
end-point: Distance2d は曲線の終了する場所を指定します。

次の例では、quadratic-curve-to 操作による Path を示します。


例: quadratic-curve-to 操作
{import * from PATH-DOC, location = "../docstring-support/gfx/Path-doc.scurl"}
{value
    let start-point:Distance2d = {Distance2d 100pt, 250pt}
    let control-point:Distance2d = {Distance2d 250pt, 50pt}
    let end-point:Distance2d = {Distance2d 400pt, 250pt}

    let path:Path = {Path}
    {path.move-to start-point}
    {path.quadratic-curve-to
        control-point,
        end-point
    }

    || External Graphic used to help demonstrate the use
    || of Path operations by labeling points.
    {PathDocGraphic
        width = 5cm,
        height = 4cm,
        500pt,
        400pt,
        {proc {r:Renderer2d, doc:PathDocGraphic}:void
            {doc.line r, start-point, control-point}
            {doc.line r, end-point, control-point}

            {r.render-path path, fill-pattern = {FillPattern.get-red}, stroke-thickness = 2pt}
            
            {doc.end-point r, start-point}
            {doc.control-point r, control-point}
            {doc.end-point r, end-point}
        }
    }
}


quadratic-curve-to-relative (メソッド)
public final {Path.quadratic-curve-to-relative
control-point-delta:Distance2d,
end-point-delta:Distance2d
}:void

前の端点から新しい端点まで 2 次元のベジエ曲線を追加します。

説明

このメソッドは、コントロール ポイントが 1 つだけであるという点で Path.curve-to-relative と異なります。次の例を参照してください。
control-point-delta: 前の端点と相対的なコントロールポイントです。
end-point-delta: 前の端点と相対的な端点です。

注意事項

これは次と同じです。
{Path.quadratic-curve-to
    control-point + path.last-point,
    end-point-delta + path.last-point
}

次の例では、quadratic-curve-to-relative 操作による Path を示します。


例: quadratic-curve-to-relative 操作
{import * from PATH-DOC, location = "../docstring-support/gfx/Path-doc.scurl"}
{value
    let start-point:Distance2d = {Distance2d 100pt, 250pt}
    let control-point-delta:Distance2d = {Distance2d 150pt, -200pt}
    let end-point-delta:Distance2d = {Distance2d 300pt, 0pt}

    let path:Path = {Path}
    {path.move-to start-point}
    {path.quadratic-curve-to-relative
        control-point-delta,
        end-point-delta
    }

    || External Graphic used to help demonstrate the use
    || of Path operations by labeling points.
    {PathDocGraphic
        width = 5cm,
        height = 4cm,
        500pt,
        400pt,
        {proc {r:Renderer2d, doc:PathDocGraphic}:void
            {doc.line r, start-point, control-point-delta + start-point}
            {doc.line r, end-point-delta + start-point, control-point-delta + start-point}

            {r.render-path path, fill-pattern = {FillPattern.get-red}, stroke-thickness = 2pt}

            {doc.end-point r, start-point}
            {doc.control-point r, control-point-delta + start-point}
            {doc.end-point r, end-point-delta + start-point}
        }
    }
}


smooth-curve-to (メソッド)
public final {Path.smooth-curve-to
control-point2:Distance2d,
end-point:Distance2d
}:void

前の端点から新しい端点まで 3 次元のベジエ曲線を追加し、2 つの曲線をスムーズに結合します。

説明

この操作は、通常、他の曲線操作の後にだけ使用されます。

最初の (暗黙の) コントロール ポイントは、前の端点の周りにある前の曲線の 2 番目のコントロール ポイントの反転です。次の例を参照してください。
control-point2: 新しい曲線の形状を指定するために使用される 2 番目のコントロール ポイントです。
end-point: は新しい曲線の終了する場所を指定する Distance2d

注意事項

前の操作が曲線ではなかった場合、smooth-curve-to は前の端点をその最初のコントロール ポイントとして使用します。

次の例では、smooth-curve-to 操作による Path を示します。


例: smooth-curve-to 操作
{import * from PATH-DOC, location = "../docstring-support/gfx/Path-doc.scurl"}
{value
    let start-point:Distance2d = {Distance2d 100pt, 150pt}
    let control-point1:Distance2d = {Distance2d 100pt, 50pt}
    let control-point2:Distance2d = {Distance2d 250pt, 50pt}
    let end-point1:Distance2d = {Distance2d 250pt, 150pt}
    let implicit-control-point:Distance2d = {Distance2d 250pt, 250pt}
    let control-point3:Distance2d = {Distance2d 400pt, 250pt}
    let end-point2:Distance2d = {Distance2d 400pt, 150pt}

    let path:Path = {Path}
    {path.move-to start-point}
    {path.curve-to
        control-point1,
        control-point2,
        end-point1
    }
    {path.smooth-curve-to
        control-point3,
        end-point2
    }

    || External Graphic used to help demonstrate the use
    || of Path operations by labeling points.
    {PathDocGraphic
        width = 5cm,
        height = 4cm,
        500pt,
        400pt,
        {proc {r:Renderer2d, doc:PathDocGraphic}:void
            {doc.line r, start-point, control-point1}
            {doc.line r, end-point1, control-point2}
            {doc.line r, end-point1, implicit-control-point}
            {doc.line r, end-point2, control-point3}

            {r.render-path path, fill-pattern = {FillPattern.get-red}, stroke-thickness = 2pt}

            {doc.end-point r, start-point}
            {doc.end-point r, end-point1}
            {doc.end-point r, end-point2}
            
            {doc.control-point r, control-point1}
            {doc.control-point r, control-point2}
            {doc.control-point r, control-point3}

            {doc.implicit-control-point r, implicit-control-point}
        }
    }
}


smooth-curve-to-relative (メソッド)
public final {Path.smooth-curve-to-relative
control-point2-delta:Distance2d,
end-point-delta:Distance2d
}:void

前の端点から新しい端点まで 3 次元のベジエ曲線を追加し、2 つの曲線をスムーズに結合します。

説明

この操作は、通常、他の曲線操作の後にだけ使用されます。

最初の (暗黙の) コントロール ポイントは、前の端点の周りにある前の曲線の 2 番目のコントロール ポイントの反転です。次の例を参照してください。
control-point2-delta: 前の端点と相対的な 2 番目のコントロール ポイントで、曲線の形状を指定するために使用されます。
end-point: 前の端点と相対的な、曲線の終了する場所を指定する Distance2d です。

注意事項

前の操作が曲線ではなかった場合、smooth-curve-to-relative は前の端点をその最初のコントロール ポイントとして使用します。

このメソッドは、端点と明示的なコントロール ポイントの場所が起点ではなく前の端点と相対的であると言う点で Path.smooth-curve-to とは異なります。

これは次と同じです。
{Path.smooth-curve-to
    control-point2-delta + path.last-point,
    end-point-delta + path.last-point
}

次の例では、smooth-curve-to-relative 操作による Path を示します。


例: smooth-curve-to-relative 操作
{import * from PATH-DOC, location = "../docstring-support/gfx/Path-doc.scurl"}
{value
    let start-point:Distance2d = {Distance2d 100pt, 150pt}
    let control-point1-delta:Distance2d = {Distance2d 0pt, -100pt}
    let control-point2-delta:Distance2d = {Distance2d 150pt, -100pt}
    let end-point1-delta:Distance2d = {Distance2d 150pt, 0pt}

    let control-point3-delta:Distance2d = {Distance2d 150pt, 100pt}
    let end-point2-delta:Distance2d = {Distance2d 150pt, 0pt}

    let path:Path = {Path}
    {path.move-to start-point}
    {path.curve-to-relative
        control-point1-delta,
        control-point2-delta,
        end-point1-delta
    }
    {path.smooth-curve-to-relative
        control-point3-delta,
        end-point2-delta
    }

    || External Graphic used to help demonstrate the use
    || of Path operations by labeling points.
    {PathDocGraphic
        width = 5cm,
        height = 4cm,
        500pt,
        400pt,
        {proc {r:Renderer2d, doc:PathDocGraphic}:void

            let implicit-control-point:Distance2d = {Distance2d 250pt, 250pt}

            {doc.line r, start-point, control-point1-delta + start-point}
            {doc.line r, end-point1-delta + start-point, control-point2-delta + start-point}
            {doc.line r, end-point1-delta + start-point, implicit-control-point}
            {doc.line r, end-point2-delta + end-point1-delta + start-point, control-point3-delta + end-point1-delta + start-point}

            {r.render-path path, fill-pattern = {FillPattern.get-red}, stroke-thickness = 2pt}

            {doc.end-point r, start-point}
            {doc.end-point r, end-point1-delta + start-point}
            {doc.end-point r, end-point2-delta + end-point1-delta + start-point}

            {doc.control-point r, control-point1-delta + start-point}
            {doc.control-point r, control-point2-delta + start-point}
            {doc.control-point r, control-point3-delta + end-point1-delta + start-point}

            {doc.implicit-control-point r, implicit-control-point}
        }
    }
}


smooth-quadratic-curve-to (メソッド)
public final {Path.smooth-quadratic-curve-to end-point:Distance2d}:void

前の端点から新しい端点まで 2 次元のベジエ曲線を追加し、2 つの曲線をスムーズに結合します。

説明

この操作は、通常、他の曲線操作の後にだけ使用されます。

暗黙のコントロール ポイントは、前の端点の周りにある前の曲線のコントロール ポイントの反転です。次の例を参照してください。
end-point: Distance2d は曲線の終了する場所を指定します。

注意事項

前の操作が曲線ではなかった場合、smooth-quadratic-curve-to は前の端点をコントロール ポイントとして使用します。

次の例では、smooth-quadratic-curve-to 操作による Path を示します。


例: smooth-quadratic-curve-to 操作
{import * from PATH-DOC, location = "../docstring-support/gfx/Path-doc.scurl"}
{value
    let start-point:Distance2d = {Distance2d 100pt, 150pt}
    let control-point:Distance2d = {Distance2d 175pt, 50pt}
    let end-point1:Distance2d = {Distance2d 250pt, 150pt}
    let implicit-control-point:Distance2d = {Distance2d 325pt, 250pt}
    let end-point2:Distance2d = {Distance2d 400pt, 150pt}

    let path:Path = {Path}
    {path.move-to start-point}
    {path.quadratic-curve-to
        control-point,
        end-point1
    }
    {path.smooth-quadratic-curve-to
        end-point2
    }

    || External Graphic used to help demonstrate the use
    || of Path operations by labeling points.
    {PathDocGraphic
        width = 5cm,
        height = 4cm,
        500pt,
        400pt,
        {proc {r:Renderer2d, doc:PathDocGraphic}:void

            {doc.line r, start-point, control-point}
            {doc.line r, end-point1, control-point}
            {doc.line r, end-point1, implicit-control-point}
            {doc.line r, end-point2, implicit-control-point}

            {r.render-path path, fill-pattern = {FillPattern.get-red}, stroke-thickness = 2pt}

            {doc.end-point r, start-point}
            {doc.end-point r, end-point1}
            {doc.end-point r, end-point2}

            {doc.control-point r, control-point}
            {doc.implicit-control-point r, implicit-control-point}
        }
    }
}


smooth-quadratic-curve-to-relative (メソッド)
public final {Path.smooth-quadratic-curve-to-relative
end-point-delta:Distance2d
}:void

前の端点から新しい端点まで 2 次元のベジエ曲線を追加し、2 つの曲線をスムーズに結合します。

説明

この操作は、通常、他の曲線操作の後にだけ使用されます。

暗黙のコントロール ポイントは、前の端点の周りにある前の曲線のコントロール ポイントの反転です。次の例を参照してください。
end-point-delta: 前の端点と相対的な端点です。

注意事項

これは次と同じです。
{Path.smooth-quadratic-curve-to
    end-point-delta + path.last-point
}

次の例では、smooth-quadratic-curve-to-relative 操作による Path を示します。


例: smooth-quadratic-curve-to-relative 操作
{import * from PATH-DOC, location = "../docstring-support/gfx/Path-doc.scurl"}
{value
    let start-point:Distance2d = {Distance2d 100pt, 150pt}
    let control-point-delta:Distance2d = {Distance2d 75pt, -100pt}
    let end-point1-delta:Distance2d = {Distance2d 150pt, 0pt}

    let end-point2-delta:Distance2d = {Distance2d 150pt, 0pt}

    let path:Path = {Path}
    {path.move-to start-point}
    {path.quadratic-curve-to-relative
        control-point-delta,
        end-point1-delta
    }
    {path.smooth-quadratic-curve-to-relative
        end-point2-delta
    }

    || External Graphic used to help demonstrate the use
    || of Path operations by labeling points.
    {PathDocGraphic
        width = 5cm,
        height = 4cm,
        500pt,
        400pt,
        {proc {r:Renderer2d, doc:PathDocGraphic}:void

            let implicit-control-point:Distance2d = {Distance2d 325pt, 250pt}

            {doc.line r, start-point, control-point-delta + start-point}
            {doc.line r, end-point1-delta + start-point, control-point-delta + start-point}
            {doc.line r, end-point1-delta + start-point, implicit-control-point}
            {doc.line r, end-point2-delta + end-point1-delta + start-point, implicit-control-point}

            {r.render-path path, fill-pattern = {FillPattern.get-red}, stroke-thickness = 2pt}

            {doc.end-point r, start-point}
            {doc.end-point r, end-point1-delta + start-point}
            {doc.end-point r, end-point2-delta + end-point1-delta + start-point}

            {doc.control-point r, control-point-delta + start-point}
            {doc.implicit-control-point r, implicit-control-point}
        }
    }
}


to-Iterator (メソッド)
public {Path.to-Iterator}:{Iterator-of PathIteratorItem}

この Path の各要素をイテレートすることができるオブジェクトを返します。

戻り値

イテレータオブジェクト。; これは Iterator-of PathIteratorItem のサブクラスです。

説明

この Path の各要素を順に確認するために、返された Iterator-of PathIteratorItem を使うことができます。曲線のパスでは、このテクニックは Pathfor ループを使用するか直接 Path.get を使用するよりわずかに効果的です。
繰り返し同じ Path をイテレートする場合は、Iterator-of オブジェクトの不要なアロケーションを避けることが出来ます。それは、Iterator-of オブジェクトを保持し続けて、新しくループ処理を始める必要がある度に、Iterator-of.reset を呼び出します。
ほとんどのイテレータでは、 Path に関連するイテレータの挙動は、修正されました。イテレータが作成されたか、リセットが未定義な為ですIterator-of.reset を呼ぶことはこの場合、適切な振る舞いを確実にするために十分です。

このアプレットは Path の要素を確認するために to-Iterator を使用するデモです。

例: to-Iterator を使用した Path のイテレーション
{import * from CURL.GUI.SHAPES}
{def path =
    {Path 
        {Distance2d 0.5in, 0.3in},
        PathOperation.line-to,
        {Distance2d 2in, 1.5in},
        PathOperation.move-to,
        {Distance2d 2in, 1.9in},
        PathOperation.curve-to,
        {Distance2d 3in, 1.7in},
        {Distance2d 3in, 0.7in},
        {Distance2d 2in, 0.2in}
    }
}

{PathShape path, stroke-thickness = 3pt}

{def table =
    {Table
        cell-border-width = 1pt,
        cell-border-color = FillPattern.silver,
        font-size = .8em,
        {row-prototype
            font-style = FontStyle.italic,
            {text Previous},
            {text Operation},
            {text Control point 1},
            {text Control point 2},
            {text End\ }
        }
    }
}
{for item in {path.to-Iterator} do
    {table.add
        {row-prototype
            item.previous,
            item.operation.name,
            item.control-1,
            item.control-2,
            item.end
        }
    }
}
{value table}
導入: バージョン 7.0


to-line-segment-path (メソッド)
public {Path.to-line-segment-path
max-angle:Angle = 10degrees,
out:#Path = null
}:Path

この Path を、線および移動セグメントだけで構成されたパスに近似させて分解します。常に新しい Path を返します。

max-angle: 曲線を再分割する際の、隣接する線セグメント エッジ間の最大許容角度です。既定値は 10 度です。
out: 出力の保持に使用できる Path です。

注意事項

このメソッドで self が変化することはありません。out が指定されていない場合、または outself である場合、クローンが割り当てられます。


to-regions (メソッド)
public {Path.to-regions
thickness:Distance,
overlap-ok?:bool = false
}:{Array-of Region}

パスの中心の回りに太いラインを形成する一連の領域を作成します。

説明

パスが空の場合は、空の配列を返します。
thickness: 幅を拡くした Path の適切な太さを表す Distance
overlap-ok?: true のとき、返される領域がオーバーラップすることがあります。これは、パスを通常のように引いて結果の Region を透過せずに描く場合に役立ちます。オーバーラップしない Region を作成するには、より多くの計算が必要です。既定値は false です。


to-source-code (メソッド)
public {Path.to-source-code}:String

この Path のコピーを表示する Curl ソース コードを含む String を返します。



transform-clone (メソッド)
public {Path.transform-clone
transformation:Transformation2d,
out:#Path = null
}:Path

transformationPath を変換し、変換した Path を返します。

注意事項

この transform-clone メソッドは、self を変更しません。変更の結果を返します。このメソッドは、オプションの out パラメータとして渡された Path を使用します。out パラメータが指定されていない場合、新しい Path インスタンスが割り当てられます。この場合、変換された Path が返されます。

プログラミング注意事項

Path.transform を使用するコードを以下の方法で記述できます。

let result:Path = {Path}
set result = {original-path.transform-clone, out=result}
result には変換された Path が含まれ、original-path は変更されません。