2013-03-24 2 views
5

मैं एक कैनवास पर एक आयताकार और आयताकार के केंद्र से एक रेखा को समन्वय अंतरिक्ष में कुछ यादृच्छिक बिंदु तक खींच रहा हूं।रेखा आयताकार पार करती है - क्रॉस पॉइंट कैसे ढूंढें?

अब, मैं रेखा को आयताकार के अंदर की लंबाई से छोटा करना चाहता हूं ताकि लाइन आयताकार किनारे पर शुरू हो।

मैं यह कैसे कर सकता हूं?

उदाहरण

  • आयत 2 अंक से परिभाषित किया जा सकता है: Pstart(1, 3), Pend(3, 1)
  • केंद्र बिंदु के लिए गणना की जा सकती: P(2, 2)
  • अब P(2, 2) से Q(10, 2) को रेखा खींचना।

मुझे पता है के रूप में आयत की चौड़ाई 2 है, मैं P(4, 2) बजाय P(2, 2) पर शुरू करने के लिए लाइन बता सकते हैं।

यह अधिक जटिल हो जाता है जब बिंदु XY धुरी में से एक के समानांतर नहीं होता है। इसके अलावा आयताकार के अंदर की लंबाई विकर्ण रेखाओं के लिए अलग-अलग राशि होगी।

आयत के केंद्र और रेखा के अंत बिंदु के संबंध में रेखा बिंदु के लिए स्टार्ट ऑफ़सेट की गणना कैसे कर सकता हूं?

शायद मुझे उस बिंदु को ढूंढना होगा जहां रेखा आयताकार पार करेगी, और उसके बाद लाइन को क्रॉस पॉइंट पर शुरू करें। लेकिन मैं इस बिंदु को कैसे प्राप्त कर सकता हूं?

+1

इस पृष्ठ पर समाधान का एक समूह है: http: // stackoverflow।कॉम/प्रश्न/1585525/कैसे-से-खोज-द-चौराहे-बिंदु-बीच-ए-लाइन-एंड-ए-आयत उस पृष्ठ पर समाधान चुनें जो आपको सबसे ज्यादा समझ में आता है और उस पर पहुंच जाता है। – Michael

उत्तर

12

ईमानदारी से, मैं गणित समझ में नहीं है, लेकिन ...

अनिवार्य रूप से, आप 5 लाइनों की है। मूल रेखा और आयताकार की 4 रेखाएं। तो अगर आप यह लाइन समस्या का एक सरल रेखा चौराहे तक टूट यह थोड़ा आसान हो जाना चाहिए ...

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.Line2D; 
import java.awt.geom.Point2D; 
import java.awt.geom.Rectangle2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class IntersectPoint { 

    public static void main(String[] args) { 
     new IntersectPoint(); 
    } 

    public IntersectPoint() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      int x = (int) (getWidth() * 0.2f); 
      int y = (int) (getHeight() * 0.2f); 
      int width = (int) (getWidth() * 0.6f); 
      int height = (int) (getHeight() * 0.6f); 

      int x1 = x; 
      int y1 = 0; 
      int x2 = x + width; 
      int y2 = getHeight(); 

      Line2D line = new Line2D.Double(x1, y1, x2, y2); 
      Rectangle2D rect = new Rectangle2D.Double(x, y, width, height); 

      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.draw(rect); 
      g2d.draw(line); 

      g2d.setColor(Color.RED); 
      Point2D[] ps = getIntersectionPoint(line, rect); 
      for (Point2D p : ps) { 
       if (p != null) { 
        g2d.fill(new Ellipse2D.Double(p.getX() - 4, p.getY() - 4, 8, 8)); 
       } 
      } 
      g2d.dispose(); 

     } 

     public Point2D[] getIntersectionPoint(Line2D line, Rectangle2D rectangle) { 

      Point2D[] p = new Point2D[4]; 

      // Top line 
      p[0] = getIntersectionPoint(line, 
          new Line2D.Double(
          rectangle.getX(), 
          rectangle.getY(), 
          rectangle.getX() + rectangle.getWidth(), 
          rectangle.getY())); 
      // Bottom line 
      p[1] = getIntersectionPoint(line, 
          new Line2D.Double(
          rectangle.getX(), 
          rectangle.getY() + rectangle.getHeight(), 
          rectangle.getX() + rectangle.getWidth(), 
          rectangle.getY() + rectangle.getHeight())); 
      // Left side... 
      p[2] = getIntersectionPoint(line, 
          new Line2D.Double(
          rectangle.getX(), 
          rectangle.getY(), 
          rectangle.getX(), 
          rectangle.getY() + rectangle.getHeight())); 
      // Right side 
      p[3] = getIntersectionPoint(line, 
          new Line2D.Double(
          rectangle.getX() + rectangle.getWidth(), 
          rectangle.getY(), 
          rectangle.getX() + rectangle.getWidth(), 
          rectangle.getY() + rectangle.getHeight())); 

      return p; 

     } 

     public Point2D getIntersectionPoint(Line2D lineA, Line2D lineB) { 

      double x1 = lineA.getX1(); 
      double y1 = lineA.getY1(); 
      double x2 = lineA.getX2(); 
      double y2 = lineA.getY2(); 

      double x3 = lineB.getX1(); 
      double y3 = lineB.getY1(); 
      double x4 = lineB.getX2(); 
      double y4 = lineB.getY2(); 

      Point2D p = null; 

      double d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4); 
      if (d != 0) { 
       double xi = ((x3 - x4) * (x1 * y2 - y1 * x2) - (x1 - x2) * (x3 * y4 - y3 * x4))/d; 
       double yi = ((y3 - y4) * (x1 * y2 - y1 * x2) - (y1 - y2) * (x3 * y4 - y3 * x4))/d; 

       p = new Point2D.Double(xi, yi); 

      } 
      return p; 
     } 
    } 
} 
+0

GetIntersectionPoint() फ़ंक्शन को सरलीकृत किया जा सकता है यदि आप जानते हैं कि लाइनों में से एक लंबवत या क्षैतिज है, जो आप करते हैं। –

+1

अच्छा जवाब! धन्यवाद – user3197818

0

आयताकार की वर्टिसेस: ए, बी, सी, डी। का प्रतिनिधित्व करते हैं एक्स और कुल्हाड़ी, ay की तरह हर एक के y coord, आदि

लाइन के अंतिम बिंदुओं:, एक्स, वाई

रेखा y = mx + b इस प्रकार है, और या तो ऊपर या नीचे चला जाता है सही है या बाएं। यह आपके संभावित आयताकार किनारों को 2 से पार करने के लिए नीचे खींचता है।

लंबवत समन्वय को निर्धारित करने के लिए वाई = एमएक्स + बी का उपयोग करें, जिस पर यह क्षैतिज रेखा को पार करता है, और क्षैतिज घटक जिस पर यह लंबवत रेखा को पार करता है। इनमें से केवल एक ही वास्तव में आपके आयत पर होगा (यानी, आयताकार किनारों में से एक के भीतर निहित), या यह एक कोने पर छेड़छाड़ करेगा।

+0

वास्तव में आप केवल 'y = mx' का उपयोग कर सकते हैं क्योंकि रेखा आयताकार – Breavyn

+0

के केंद्र में शुरू होती है मैंने गणित को पूरी तरह से काम नहीं किया है, लेकिन मुझे लगता है कि * काम नहीं करेगा *। 'बी' ऑफ़सेट आपको x = 0 के लिए 'y' समन्वय बताता है, यानी, ढलान 'एम' के साथ रेखा की ऊर्ध्वाधर स्थिति। यह निश्चित रूप से प्रभावित करेगा कि सामान्य आय में, कौन सा आयताकार किनारा एक रेखा से अलग किया जाता है। मुझे नहीं लगता कि इनमें से कोई भी अंक उत्पत्ति पर है। – arcy

+0

हाँ, अगर आप आयत के बारे में केंद्रित हैं तो आप केवल बी = 0 मान सकते हैं। –

संबंधित मुद्दे