2016-04-14 6 views
0

私は、Webサービスから背景画像タイルをダウンロードするための領域を定義するために、マップキャンバス上に長方形を描くことができるWPFユーザーコントロールを用意しています。タイルは長さ1x1の緯度にあります。ポイントのリストから交差しているが重複していないマップダウンロードタイルをダウンロードしていますか?

これは動作しています、私はパラメータとしてポイントを渡します&タイルをダウンロードします。しかし、私は今、をユーザ定義の矩形&の各コーナーに渡そうとしているので、各タイルが各ポイントと交差するかどうかを判断します。

ForEach(point in rectanglePointsList) 
{ 
    DownloadTile(point); 
} 

Iポイントを反復処理する必要があるのか​​どうかを判断&:これは、ユーザーが、同じタイルは(各点について1回)4回ダウンロードされている単一のタイル内に完全に矩形を定義している場合しかし程度まで動作します後続のタイルをダウンロードするかどうか。このコードはタイルにはダムですが、私は渡しているポイントパラメータしか持っていません。同僚はネストされたforループを提案し、それによって各ポイントからX & Yを変換し、最小値を見つけます。& max &タイルは常に1x1度であることを知ってダウンロードする必要があります。これを達成するためのアルゴリズムはありますか?どこから始めるべきか本当に分かりません。ここで

List<int>xValuesList = new List<int>(); 
List<int> yValuesList = new List<int>(); 

ForEach(point in RectanglePointsList) 
{ 
    xValuesList.Add(Convert.ToInt32(point.X); 
    yValuesList.Add(Convert.ToInt32(point.Y); 
} 

int maxX = xValuesList.Select(value => value.X).Max(); 
int maxY = yValuesList.Select(value => value.Y).Max(); 

//Lost after here... 
+0

マップタイルのインデックス作成はどのように行われますか?左上隅から開始しますか?つまり、(0,0)のタイルは経度-180、緯度90ですか? – Clemens

答えて

1

は、迅速なサンプルです:D

  • はタイル
  • のグループを選択
  • 追加されたショーやない
  • 追加しますかキャッシュにAサポート単一のマウスクリック、矩形を描く必要はありません。
  • e ncompasses選択したタイルあなたが/終了ここ

私は最初の補数でクリックした、私は以下の補数を囲む四角形を描画した。この時開始に関係なく、彼らは二度追加されていません。

enter image description here

XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:WpfApplication1" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     x:Name="Window" 
     Title="MainWindow" 
     Width="525" 
     Height="350" 
     Background="Transparent" 
     SnapsToDevicePixels="True" 
     UseLayoutRounding="True" 
     mc:Ignorable="d"> 
    <Grid /> 
</Window> 

コード:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows; 
using System.Windows.Input; 
using System.Windows.Media; 

namespace WpfApplication1 
{ 
    public partial class MainWindow : Window 
    { 
     private readonly HashSet<Int32Point> _set = new HashSet<Int32Point>(); 
     private readonly int columns = 10; 
     private readonly int rows = 10; 
     private bool _down; 
     private Point _position1; 
     private Point _position2; 
     private Size size = new Size(500, 500); 

     public MainWindow() 
     { 
      InitializeComponent(); 
      MouseDown += MainWindow_MouseDown; 
      MouseMove += MainWindow_MouseMove; 
      MouseUp += MainWindow_MouseUp; 
     } 

     private void MainWindow_MouseUp(object sender, MouseButtonEventArgs e) 
     { 
      _down = false; 
      InvalidateVisual(); 

      // find rects selected 
      var x1 = (int) Math.Floor(_position1.X/(size.Width/columns)); 
      var y1 = (int) Math.Floor(_position1.Y/(size.Height/rows)); 
      var x2 = (int) Math.Ceiling(_position2.X/(size.Width/columns)); 
      var y2 = (int) Math.Ceiling(_position2.Y/(size.Height/rows)); 
      var w = x2 - x1; 
      var h = y2 - y1; 

      var builder = new StringBuilder(); 
      for (var y = 0; y < h; y++) 
      { 
       for (var x = 0; x < w; x++) 
       { 
        var int32Point = new Int32Point(x1 + x, y1 + y); 
        var add = _set.Add(int32Point); 
        if (add) 
        { 
         // download image !!! 
        } 
        else 
        { 
         // image already downloaded, do something ! 
        } 
        builder.AppendLine(string.Format("{0} : {1}", int32Point, (add ? "added" : "ignored"))); 
       } 
      } 
      MessageBox.Show(builder.ToString()); 
     } 

     private void MainWindow_MouseMove(object sender, MouseEventArgs e) 
     { 
      _position2 = e.GetPosition(this); 
      InvalidateVisual(); 
     } 

     private void MainWindow_MouseDown(object sender, MouseButtonEventArgs e) 
     { 
      _position1 = e.GetPosition(this); 
      _down = true; 
     } 

     protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo) 
     { 
      InvalidateVisual(); 
     } 

     protected override void OnRender(DrawingContext drawingContext) 
     { 
      // draw a mini-map 
      for (var y = 0; y < rows; y++) 
      { 
       for (var x = 0; x < columns; x++) 
       { 
        var color = Color.FromRgb((byte) ((double) x/columns*255), (byte) ((double) y/rows*255), 255); 
        var brush = new SolidColorBrush(color); 
        var w = size.Width/columns; 
        var h = size.Height/rows; 
        var rect = new Rect(w*x, h*y, w, h); 
        drawingContext.DrawRectangle(brush, null, rect); 
       } 
      } 

      // draw selection rectangle 
      if (_down) 
      { 
       drawingContext.DrawRectangle(null, new Pen(new SolidColorBrush(Colors.White), 2.0), 
        new Rect(_position1, _position2)); 
      } 
     } 

     private struct Int32Point 
     { 
      public readonly int X, Y; 

      public Int32Point(int x, int y) 
      { 
       X = x; 
       Y = y; 
      } 

      public override string ToString() 
      { 
       return $"X: {X}, Y: {Y}"; 
      } 
     } 
    } 
} 

その上に移動し、向上させます!

関連する問題