0

私たちは、ツリー/フォレストアルゴリズムに基づいたコーディングに関するいくつかの作業を含むプロジェクトを扱っています。

2Dグラフィック環境で、一連の線AB、BC、およびCDを描画していると考えてください。これらの3つの線分は、BポイントとCポイントで接続されています。

ここに画像の説明を入力してください

想像してみましょう。ABとBCは水平ですが、CDは垂直です。

ここで、ABを90度(反時計回り)回転させると、残りの線は同じ回転度に従う必要があります。これで、コードではABとBCは正常に機能しますが、CDに関しては、残りの行には従いません。

したがって、次のようなものを期待します。

ここに画像の説明を入力してください

再帰的な方法が必要なようですが、CDは最後に別の行を取得する可能性があるため、ここでどのような境界を考慮する必要があるかわかりません。たとえば、DEのように、ブールフラグを「bLastLine」として追加してもここでは役に立ちません。

では、行がいつ終了したかをどのように知ることができますか?実際、ツリーに境界を割り当てる方法を知る必要があります。

ありがとう。

4

1 に答える 1

1

わかりました、だから私はここで手足を出します。ノード (A、B、C、D) があり、それらの間に線分があります。これは、ツリーよりも適している可能性がある Graph(V,E) と見なすことができます。

WPFの場合:

Vertex クラスには ObservableCollection 型の Edges プロパティがあり、Vertex クラスには Point 型の Point プロパティがあります。Edge クラスには、ObservableCollection タイプの Vertices プロパティがあり、これは 2 になります。

ViewModel には、バインドするすべてのエッジとすべての頂点のリストが含まれます。

View は、エッジを Line として DataTemplate します。DataTemplate 内で、エッジの両方の頂点にドリルダウンして、線の両端を取得します。(頂点に小さな楕円を使用できます。)

数学のために:

private static Point[] Translate(Point[] points, double tX, double tY)
{
    return points.Select(p => new Point(p.X + tX, p.Y + tY)).ToArray();
}

private static Point[] Rotate(Point[] points, double theta)
{
    return points.Select(p =>
                        new Point(p.X * Math.Cos(theta) - p.Y * Math.Sin(theta),
                                    p.X * Math.Sin(theta) + p.Y * Math.Cos(theta)))
                    .ToArray();
}

public Point[] RotatePointsAroundPoint(Point[] points, Point origin, double theta)
{
    var tPoints = Translate(points, -origin.X, -origin.Y);
    tPoints = Rotate(tPoints, theta);
    return Translate(tPoints, origin.X, origin.Y);
}

public void RotateGraph(Vertex[] vertices, Point origin, double theta)
{
    var points = vertices.Select(v => v.Point).ToArray();

    var tPoints = RotatePointsAroundPoint(points, origin, theta);

    for(var i = 0; i < vertices.Length; i++)
        vertices[i].Point = tPoints[i]; 
}

これで、原点と回転角度を決定するだけで済みます。でセッターを呼び出すとVertex.PointNotifyPropertyChangedイベントによってView.

于 2012-11-15T23:15:00.393 に答える