1

Dundasマップを使用していますが、データを表すバブルをマップにオーバーレイする必要があります。これを実現するために、マップに図形を追加したいと思います。次のような三角形(または任意の直線ポリゴン)を追加できます。

public static void AddShape(this MapControl map, List<MapPoint> points, Color color, string name)
{
    if (points[0].X != points[points.Count - 1].X && points[0].Y != points[points.Count - 1].Y)
        points.Add(points[0]);
    var shape = new Shape
    {
        Name = name,
        BorderColor = color,
        BorderStyle = MapDashStyle.Solid,
        BorderWidth = 1,
        Color = Color.FromArgb((int)(255 * (0.3)), color)
    };
    var segments = new[] {new ShapeSegment {Type = SegmentType.Polygon, Length = points.Count}};
    shape.AddSegments(points.ToArray(), segments);
    map.Shapes.Add(shape);
}

public static void AddBermudaTriangle(this MapControl map)
{
    var points = new List<MapPoint>
                     {
                         new MapPoint(-80.15, 26.0667),
                         new MapPoint(-64.75, 32.333),
                         new MapPoint(-66.07, 18.41)
                     };
    map.AddShape(points, Color.Red, "Bermuda Triangle");
}

バミューダトライアングル

バミューダトライアングルが地図を赤でオーバーレイしていることがわかります。次に、楕円または円を描画するAddShapeメソッドに渡す一連のポイントを計算します。与えられた数の点のx座標とy座標を計算するための簡単なアルゴリズムが必要です。おそらく、円の中心を表す特定の点から開始します。例えば:

public static void AddCircle(this MapControl map, Point centre, double radius, string name)
{
    var points = new List<MapPoint>();
    const int n = 360;
    for(var i = 0; i < n; i++)
    {
        //calculate x & y using n, radius and centre
        double x = 0;
        double y = 0;
        points.Add(new MapPoint(x, y));
    }
    map.AddShape(points, Color.Red, name);
}

x、yの計算は単純な三角法であることは知っていますが、脳が凍結しているのです。ヘルプ!

編集(tur!ngのコードを使用して解決):

public static void AddCircle(this MapControl map, Color color, MapPoint centre, double radius, string name)
{
    var points = new List<MapPoint>();
    const int n = 360;
    for(var i = 0; i < n; i++)
    {
        var x = (radius * Math.Cos(i * Math.PI / 180)) + centre.X;
        var y = (radius * Math.Sin(i * Math.PI / 180)) + centre.Y;
        points.Add(new MapPoint(x, y));
    }
    map.AddShape(points, color, name);
}

代替テキスト

(グリニッジの上の)青い円は、ロビンソングリッド上の地図投影のために歪んでいます。

4

3 に答える 3

2
  double x = centre.x + radius*Math.cos(2*Math.PI/360 * i);
  double y = centre.y + radius*Math.sin(2*Math.PI/360 * i);

円のために。

于 2010-02-17T11:37:56.860 に答える
2

私がずっと前に書いた古い C++ プログラムからコピーしたもので、今でも何十もの場所で実行されています。

  // Approximate arc with small line segments
  double sa = dp[ix].center.angle(dp[ix].co);
  double ea = dp[ix].center.angle(dp[ix+1].co);
  double r = scale * dp[ix].radius;
  double rot = ea - sa;
  double inc = rot;
  if (dp[ix].dir == ROTCW) rot = -rot;
  if (rot < 0) rot += 2*PI;
  // Compute rotation increment that generates less than 1/4 pixel error
  if (r > 2) inc = 2*acos(1-0.25/r);
  if (inc >= rot || r < 2) addPoint(x, y);
  else {
    int cnt = int(1 + rot / inc);
    inc = rot / cnt;
    if (dp[ix].dir == ROTCW) inc = -inc;
    for (int jx = 0; jx < cnt; ++jx) {
      x = offsx + scale * dp[ix].center.x + r * cos(sa);
      y = offsy + scale * dp[ix].center.y + r * sin(sa);
      addPoint(x, y);
      sa += inc;
    }
  }

acos() は Math.Acos() と同じです。

于 2010-02-17T11:38:28.340 に答える
2

円の公式は次のように表すことができることを思い出してください。

(x/r)**2 + (y/r)**2 = 1

ここで、x と y は座標、r は半径です。

楕円の式は、次のように表すことができます。

(x/a)**2 + (y/b)**2 = 1

ここで、a と b は長半径と短半径です (順不同)。a と b を選択して、「見栄えのする」楕円を作成します。

通常は、円の周りのポイントを等角ステップで選択して、真円に近い多角形の見栄えを良くする必要があります。このために、置換を使用します

x = r cos theta
y = r sin theta

ゼロから2 * piまでのシータのループを実行します。あなたの楕円のために、あなたは使用します

x = a cos theta
y = b sin theta

これにより、長半径と短半径が X 軸と Y 軸に平行で、原点を中心とする楕円が得られます。任意の位置で任意の向きが必要な場合は、角度 phi による回転と平行移動を適用する必要があります。適切なコンピュータ グラフィックス テキストは、必要な方程式を、ほとんどの場合行列形式で提供します。

于 2010-02-17T11:40:26.480 に答える