これは、 Mathematica でワイヤフレームに関する私の質問に対する答えを見つけようとする私の試みの一部です。
一連の線分が与えられた場合、接続されていて同じ線上にある 2 つの線分を結合するにはどうすればよいでしょうか。たとえば、線分l1 = {(0,0), (1,1)}と を考えてみましょうl2 = {(1,1), (2,2)}。これらの 2 つの線分は、1 つの線分、つまり に結合できますl3 = {(0,0), (2,2)}。これは、l1とl2が点を共有し、(1,1)各線分の傾きが同じであるためです。ここにビジュアルがあります:
l1 = JoinedCurve[{{{0, 2, 0}}}, {{{0, 0}, {1, 1}}}, CurveClosed -> {0}];
l2 = JoinedCurve[{{{0, 2, 0}}}, {{{1, 1}, {2, 2}}}, CurveClosed -> {0}];
Graphics[{Red, l1, Blue, l2}, Frame -> True]

注意すべきことの 1 つは、上記の例l1で とl2を 3 つの点で指定された 1 つの線に結合できること{{0,0},{1,1},{2,2}}です。
この質問の最初の部分は次のとおりです。2 つの点で指定された線分のセットが与えられた場合、このセットを減らして、重複する点の数を最小限に抑えるにはどうすればよいでしょうか。この構成例を考えてみましょう:
lines = {
{{0,0}, {1,1}},
{{3,3}, {2,2}},
{{2,2}, {1,1}},
{{1,1}, {0.5,0.5}},
{{0,1}, {0,2}},
{{2,3}, {0,1}}
}
私が欲しいのはREDUCE、次の出力を与える関数 say です。
R = {
{{0,0}, {1,1}, {2,2}, {3,3}},
{{1,1}, {0.5,0.5}},
{{2,1}, {0,1}, {0,2}}
}
必要な重複は だけです{1,1}。私がこれを行った方法は次のとおりです: 最初の行を に置き、次の行Rを見て、 のlines行の端点と一致する端点がないことに気付いたRので、この新しい行を に追加しましたR。の次の行はlinesです{{2,2},{1,1}}。エンドポイント{1,1}は の最初の行と一致するRため、 の行に追加{2,2}しましたR。に追加{{1,1}, {0.5,0.5}}しR、 も追加し{{0,1}, {0,2}}ます。の最後の行にlinesは のエンドポイントと一致するエンドポイントがあるRので、それを追加したので、{{2,1}, {0,1}, {0,2}}. 最後に、すべての行をR見て、いずれかの端点が一致するかどうかを確認します。この場合、行{{3,3}, {2,2}}は最初の行の右端点と一致しますRしたがって、追加{3,3}する必要がなくなります{2,2}。
これは、最適な削減が得られないという意味で、最適な方法ではない可能性があります。いずれにせよ、この縮小関数があると仮定すると、線を記述するためにすべての点が必要かどうかを確認できます。これは次のように行うことができます。
線を表す点が 3 つ以上ある場合は、最初の 3 つの点が同一線上にあるかどうかを確認します。同一線上にある場合は、中央の点を削除し、2 つの端点と新しい点のセットでチェックを行います。それらが同一線上にない場合は、1 点ずらして次の 3 点を確認します。
この質問をしている理由は、2D 図形を記述するために必要なポイントの量を減らしたいからです。次のことを試してください。
g1 = ListPlot3D[
{{0, -1, 0}, {0, 1, 0}, {-1, 0, 1}, {1, 0, 1}, {-1, 1, 1}},
Mesh -> {2, 2},
Boxed -> False,
Axes -> False,
ViewPoint -> {2, -2, 1},
ViewVertical -> {0, 0, 1}
]

次のMathematica 8関数は、3Dオブジェクトを、オブジェクトのワイヤーフレームを表す線のリスト(線は2点のリスト)に変更します:
G3TOG2INFO[g_] := Module[{obj, opt},
obj = ImportString[ExportString[g, "PDF", Background -> None], "PDF"][[1]];
opt = Options[obj];
obj = Cases[obj, _JoinedCurve, \[Infinity]];
obj = Map[#[[2]][[1]] &, obj];
{obj, opt}
]
Mathematica 7では、 で置換_JoinedCurveする必要があることに注意してください_Line。g1取得した関数を適用する
{lines, opt} = G3TOG2INFO[g1];
Row[{Graphics[Map[Line[#] &, lines], opt], Length@lines}]

そこには 90 個の線分がありますが、必要なのは 12 個だけです (直線の数え方を間違えていなければ)。
そこで、あなたは挑戦します。lines図を説明するために必要な最小限の情報を得るには、どのように操作すればよいでしょうか。