วิธีค้นหาว่าสี่เหลี่ยมใดอยู่ใกล้จุดมากที่สุด

หากฉันมีวัตถุ System.Drawing.Rectangle สองชิ้นบนผืนผ้าใบและ Point วิธีที่ดีที่สุดในการคำนวณคืออะไร Rectangle (ส่วนใดส่วนหนึ่งของ Rectangle ไม่ใช่แค่ Location Point) ที่อยู่ใกล้กับ Point นั้นมากที่สุดคืออะไร

ตัวอย่างจากการทดสอบหน่วย:

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 แหล่งที่มา
comment
ใช้กระดาษและดินสอเพื่อแยกแยะสิ่งนี้ สถานการณ์มีจำนวนจำกัด หากไม่ใช่คำถามที่ไม่ชัดเจน คุณจะต้องระบุว่าจะเกิดอะไรขึ้นเมื่อมีจุด ภายใน สี่เหลี่ยมอย่างน้อย 1 รูป   -  person Hans Passant    schedule 23.11.2010
comment
คำตอบบางข้อสามารถพบได้ที่นี่: stackoverflow.com/questions/5254838/   -  person Mo0gles    schedule 22.04.2014


คำตอบ (3)


ระยะทางถึงสี่เหลี่ยมผืนผ้า = นาที (ระยะห่างระหว่างส่วนของเส้นทั้ง 4 เส้นที่เป็นขอบของสี่เหลี่ยม)

สำหรับระยะทางถึงส่วนของเส้น โปรดดูคำถามนี้

person mbeckish    schedule 22.11.2010
comment
เว้นแต่ว่าฉันขาดหายไป นี่จะให้คำตอบที่ผิดถ้าจุดนั้นอยู่ภายในสี่เหลี่ยมผืนผ้า - person CAFxX; 07.03.2013
comment
@CAFxX - ขึ้นอยู่กับว่าคุณต้องการกำหนดระยะทางถึงสี่เหลี่ยมผืนผ้าอย่างไร หากคุณกำลังคิดว่าสี่เหลี่ยมเป็นรูปทรงทึบ คุณอาจต้องการกำหนดระยะทางเป็น 0 เมื่อจุดนั้นอยู่ภายในสี่เหลี่ยม อย่างไรก็ตาม ฉันแน่ใจว่ามีหลายกรณีที่คุณต้องการให้ระยะทางกำหนดเป็นระยะทางไปยังขอบที่ใกล้ที่สุด ไม่ว่าจุดจะอยู่ภายในสี่เหลี่ยมผืนผ้าหรือไม่ก็ตาม - person mbeckish; 07.03.2013

นี่เป็นการวัดระยะทางระหว่าง 2 จุด ดังนั้นให้นำจุดพิกัดจากสี่เหลี่ยมของคุณ (ซึ่งขึ้นอยู่กับคุณในการตัดสินใจ เพราะฉันไม่รู้ว่าอะไรใกล้เคียงที่สุดสำหรับคุณ):

   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
คำถามที่แท้จริงคือฉันต้องเลือกจุดไหน ไม่ใช่วิธีคำนวณระยะทาง - person Ahmet Kakıcı; 23.11.2010
comment
ฉันคิดว่าคำถามจะกลายเป็นฉันจะค้นหาจุดใดในรูปสี่เหลี่ยมผืนผ้าใกล้กับจุดที่กำหนดมากที่สุดได้อย่างไร อย่างที่คุณพูด มันเป็นเพียงเรื่องของการหาระยะทางที่ใกล้ที่สุดระหว่างจุดเดียวและจุดที่ใกล้กับรูปสี่เหลี่ยมผืนผ้าทั้งหมด - person Michael Hedgpeth; 23.11.2010

อืม. ฉันกำลังคิดที่จะวนซ้ำอาร์เรย์สี่เหลี่ยมของคุณและจัดเก็บดัชนี X และ Y แต่ละรายการในรายการ จากนั้นคุณสามารถวนซ้ำรายการและทำบางสิ่ง abs(min(i.getX() - point)) หากเท่ากัน ให้ตรวจสอบค่า min(y)

person 08Hawkeye    schedule 22.11.2010
comment
ไม่ต้องคำนวณระยะทางแบบจุดต่อจุดก็เพียงพอแล้ว - person Ahmet Kakıcı; 23.11.2010