Note that there are some explanatory texts on larger screens.

plurals
  1. POAndroid/Java how to check if a Rectangle and a line segment intersect without line2d
    primarykey
    data
    text
    <p>in my game for Android I need to check for intersection between a rectangle and a line segment. I cannot use <a href="http://docs.oracle.com/javase/6/docs/api/java/awt/geom/Line2D.html" rel="nofollow noreferrer">line2d</a> as android does not support that. I have looked at similar questions dealing with lines and tried to modify them and failed. I also realize this <a href="https://stackoverflow.com/questions/4823789/how-to-check-if-any-point-or-part-of-a-line-is-inside-or-touches-a-rectangle">Q/A</a> which is basically what I want, however I have failed. For an example here is my code for a Line class that includes my attempt at intersection. The results have been some non-intersections returning true and some intersections returning false. EDIT: Oli Charlesworth helped me and here is working code for any googlers out there.</p> <pre><code> package com.example.HelloAndroid; import android.graphics.Rect; public class Segment { int x1; int y1; int x2; int y2; double m; double b; boolean ishoriz; boolean isvert; public Segment(int x1s, int y1s, int x2s, int y2s) { if (x1s &gt; x2s) { this.x1 = x2s; this.x2 = x1s; } else { this.x1 = x1s; this.x2 = x2s; } if (y1s &gt; y2s) { this.y1 = y2s; this.y2 = y1s; } else { this.y1 = y1s; this.y2 = y2s; } int ydif = y2s - y1s; int xdif = x2s - x1s; if (ydif == 0) { this.ishoriz = true; this.m = 0; this.b = x1s; } else if (xdif == 0) { this.isvert = true; } else { this.m = (double) ydif / xdif; double r = (double) ydif / xdif; this.b = y1s - (r * x1s); this.isvert = false; this.ishoriz = false; } } public final boolean intersected(Segment s, Segment s2) { if (s.ishoriz &amp;&amp; s2.ishoriz) { //parallel return false; } if (s.isvert &amp;&amp; s2.isvert) { //parallel return false; } if (s.isvert) { //x is constant see if the x is on the other line int x = s.x1; //add 2 for round-off error if (s2.x1 &lt;= x + 2 &amp;&amp; s2.x2 + 2 &gt;= x) { //solve and check if y is on both segments int y = (int) ((s.m * x) + s.b); if(s.y1&lt;=y+2&amp;&amp;s.y2+2&gt;=y) { if(s2.y1&lt;=y+2&amp;&amp;s2.y2+2&gt;=y) { return true;} } } return false; } if (s2.isvert) { //x is constant see if the x is on the other line int x = s2.x1; //add 2 for round-off error if (s.x1 &lt;= x + 2 &amp;&amp; s.x2 + 2 &gt;= x) { //solve and check if y is on both segments int y = (int) ((s.m * x) + s.b); if(s.y1&lt;=y+2&amp;&amp;s.y2+2&gt;=y) { if(s2.y1&lt;=y+2&amp;&amp;s2.y2+2&gt;=y) { return true;} } } return false; } if (s.ishoriz) { //y is constant see if the y is on the other line int y = s.y1; //add 2 for round-off error if (s2.y1 &lt;= y + 2 &amp;&amp; s2.y2 + 2 &gt;= y) { //solve and check if x is on both segments int x=(int) ((y-s.b)/s.m); if(s.x1&lt;=x+2&amp;&amp;s.x2+2&gt;=x) { if(s2.x1&lt;=x+2&amp;&amp;s2.x2+2&gt;=x) return true;} return false; }} if (s2.ishoriz) { //y is constant see if the y is on the other line int y = s2.y1; //add 2 for round-off error if (s.y1 &lt;= y + 2 &amp;&amp; s.y2 + 2 &gt;= y) { //solve and check if x is on both segments int x=(int) ((y-s.b)/s.m); if(s.x1&lt;=x+2&amp;&amp;s.x2+2&gt;=x) { if(s2.x1&lt;=x+2&amp;&amp;s2.x2+2&gt;=x) return true;} } return false; } if (s.m == s2.m) { //parallel return false; } // use substitution // (s.m-s2.m)x=s2.b-s.b int x = (int) (s.m - s2.m); x = (int) ((s2.b - s.b) / x); // find y int y = (int) ((x * s.m) + s.b); //check if the values are in between for both lines //add 2 for round-off error if (s.y1 &lt;= y + 2) { if (s.y2 + 2 &gt;= y) { if (s2.y1 &lt;= y + 2) { if (s2.y2 + 2 &gt;= y) { if (s.x1 &lt;= x + 2) { if (s.x2 + 2 &gt;= x) { if (s2.x1 &lt;= x + 2) { if (s2.x2 + 2 &gt;= x) { return true; } } } } } } } } return false; } public final boolean intersects2(Segment s, Rect r) { //created lines of the rect Segment top = new Segment(r.left, r.top, r.right, r.top); Segment left = new Segment(r.left, r.top, r.left, r.bottom); Segment bottom = new Segment(r.left, r.bottom, r.right, r.bottom); Segment right = new Segment(r.right, r.top, r.right, r.bottom); boolean topp = s.intersected(s, top); if (topp) { return true; } boolean leftp = s.intersected(s, left); if (leftp) { return true; } boolean bottomp = s.intersected(s, bottom); if (bottomp) { return true; } boolean rightp = s.intersected(s, right); if (rightp) { return true; } else { return false; } } </code></pre> <p>}</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload