Cara mencari persegi panjang mana yang paling dekat dengan suatu titik

Jika saya memiliki dua objek System.Drawing.Rectangle di kanvas dan Point, apa cara terbaik untuk menghitung Rectangle mana (bagian mana pun dari Rectangle, bukan hanya Location Point) yang paling dekat dengan Point itu?

Contoh dari pengujian unit:

Rectangle one = new Rectangle (0, 0, 10, 10);

Rectangle two = new Rectangle (20, 20, 10, 10);

Point point = new Point(14, 14);

Rectangle actual = ClosestToPoint(point, one, two);

// should be closer to one since one's bottom right is at (10, 10)
Assert.That(actual, Is.SameAs(one));

// method to write
public Rectangle ClosestToPoint(Point p, params Rectangle[] rectangles) { } 

person Michael Hedgpeth    schedule 22.11.2010    source sumber
comment
Gunakan selembar kertas dan pensil untuk menyelesaikannya. Ada sejumlah skenario yang terbatas. Jika tidak, ini adalah pertanyaan yang ambigu, Anda harus menentukan apa yang terjadi ketika sebuah titik berada di dalam satu atau lebih persegi panjang.   -  person Hans Passant    schedule 23.11.2010
comment
Beberapa jawaban juga dapat ditemukan di sini: stackoverflow.com/questions/5254838/   -  person Mo0gles    schedule 22.04.2014


Jawaban (3)


jarak ke persegi panjang = min (jarak ke masing-masing 4 ruas garis yang merupakan tepi persegi panjang)

Untuk jarak ke segmen garis, lihat pertanyaan ini

person mbeckish    schedule 22.11.2010
comment
Kecuali saya melewatkan sesuatu, ini akan menghasilkan jawaban yang salah jika titiknya berada di dalam persegi panjang. - person CAFxX; 07.03.2013
comment
@CAFxX - Tergantung bagaimana Anda ingin menentukan jarak ke persegi panjang. Jika Anda menganggap persegi panjang sebagai benda padat, Anda mungkin ingin menentukan jarak sebagai 0 ketika titik berada di dalam persegi panjang. Namun, saya yakin ada kalanya Anda ingin menjaga jarak didefinisikan sebagai jarak ke tepi terdekat, baik titik tersebut berada di dalam persegi panjang atau tidak. - person mbeckish; 07.03.2013

Ini untuk mengukur jarak antara 2 titik, jadi ambillah titik koordinat dari persegi panjang Anda (yang terserah Anda karena saya tidak tahu apa arti terdekat bagi Anda):

   public int Distance2D(int x1, int y1, int x2, int y2)
   {

    int result = 0;
    double part1 = Math.Pow((x2 - x1), 2);

    double part2 = Math.Pow((y2 - y1), 2);
    double underRadical = part1 + part2;
    result = (int)Math.Sqrt(underRadical);

     return result;
   }
person dexter    schedule 22.11.2010
comment
Pertanyaan sebenarnya adalah titik mana yang harus saya pilih, bukan bagaimana menghitung jarak - person Ahmet Kakıcı; 23.11.2010
comment
Saya kira pertanyaannya adalah bagaimana cara menemukan titik mana dalam persegi panjang yang paling dekat dengan titik tertentu. Lalu, seperti yang Anda katakan, yang penting hanyalah mencari jarak terdekat antara satu titik dan titik terdekat ke semua persegi panjang. - person Michael Hedgpeth; 23.11.2010

Hmm. Saya sedang berpikir untuk mengulang array persegi panjang Anda dan menyimpan setiap indeks X dan Y dalam daftar. Anda kemudian dapat menelusuri daftar dan melakukan sesuatu abs(min(i.getX() - point)). Jika keduanya sama maka periksa min(y).

person 08Hawkeye    schedule 22.11.2010
comment
tidak perlu menghitung jarak titik ke titik garis ke titik saja sudah cukup - person Ahmet Kakıcı; 23.11.2010