2011-07-04 12 views
6

Zostałem poproszony o pracę nad zadaniem, w którym będą dwie linie i muszę uzyskać punkt przecięcia dwóch linii. Obie linie są ImageView s i oba mogą być przeciągane, a gdy te dwie linie przecinają się, muszę uzyskać ten punkt przecięcia. Oto kod, który ja realizowane dotychczas:Jak uzyskać punkt przecięcia dwóch linii (ImageViews)

main.xml


<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <ImageView android:id="@+id/xImg1" android:layout_width="100sp" 
     android:layout_height="100sp" android:layout_marginTop="50sp" 
     android:layout_marginLeft="10sp" 
     android:background="@drawable/line_6x10" /> 
    <ImageView android:id="@+id/xImg2" android:layout_width="100sp" 
     android:layout_height="100sp" android:layout_marginTop="50sp" 
     android:background="@drawable/line_10x10" android:layout_marginLeft="200sp" /> 

main.java


package sra.inter; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.widget.ImageView; 
import android.widget.Toast; 
import android.widget.RelativeLayout.LayoutParams; 

public class Main extends Activity implements OnTouchListener { 
    private ImageView mImg1, mImg2; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mImg1 = (ImageView) findViewById(R.id.xImg1); 
     mImg2 = (ImageView) findViewById(R.id.xImg2); 
     mImg1.setOnTouchListener(this); 
     mImg2.setOnTouchListener(this); 
    } 

    int x1 = 100, y1 = 10, x2 = 200, y2 = 50; 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 

     if (v == mImg1) { 

      LayoutParams mLayoutParams = (LayoutParams) mImg1.getLayoutParams(); 
      if (event.getAction() == MotionEvent.ACTION_MOVE) { 

       x1 = (int) event.getRawX(); 
       y1 = (int) event.getRawY(); 
       mLayoutParams.leftMargin = x1 - 5; 
       mLayoutParams.topMargin = y1 - 60; 
       mImg1.setLayoutParams(mLayoutParams); 
       check(); 

      } 
     } else if (v == mImg2) { 

      LayoutParams mLayoutParams = (LayoutParams) mImg2.getLayoutParams(); 
      if (event.getAction() == MotionEvent.ACTION_MOVE) { 
       x2 = (int) event.getRawX(); 
       y2 = (int) event.getRawY(); 
       mLayoutParams.leftMargin = x2 - 5; 
       mLayoutParams.topMargin = y2 - 60; 
       mImg2.setLayoutParams(mLayoutParams); 
       check(); 
      } 

     } 

     return true; 
    } 

    boolean b = false; 

    private void check() { 

     if (x1 == x2 || y1 == y2) { 
      if (!b) { 
       b = true; 
Log.w("---> x1 " + x1 + " y1 :" + y1 + " x2: " + x2+ " y2 :" + y2 + "", "-->"); 
     Toast.makeText(getApplicationContext(), " interected ", 0) 
         .show(); 
       mImg1.setOnTouchListener(null); 
       mImg2.setOnTouchListener(null); 

      } 
     } 
    } 

} 

Zdjęcie 1:

line image one

Zdjęcie 2:

lineimage 2

Zdjęcie 3:

Intersection pint final out put

Jak uzyskać punkt przecięcia se dwie linie?

+1

Czy wiesz, jakie są linie (tj. Punkty początkowe/końcowe dla każdego z nich)? Pytam też, dlaczego używam dwóch ImageViews dla osobnych linii, ale przypuszczam, że jest ku temu powód. Powinieneś też raczej dodać kod do pytania zamiast do linku do wpisu na blogu. – nil

Odpowiedz

3

Zacznę od czystej matematyki!

Zakładając, że zarówno ImageView1, jak i ImageView2 nie mają przycinania (np. Linie na zdjęciach są przekątną obrazu ImageView), można użyć szerokości i wysokości obu piców, aby wyrazić obie linie w formułach. Oto przykład. UWAGA: Używam systemu współrzędnych Androida -> punkt (0,0) jest w lewym górnym rogu, a y zwiększa się do dołu !!!

Click here for graphical representation

Line1

y = h1/w1(x - a1) + b1

Line2

y = -h2/w2(x - a2) + b1 + h2

Teraz chcemy punkt, w którym line1 = line2, więc mamy

h1/w1(x - a1) + b1 = -h2/w2(x - a2) + b1 + h2

Jeśli re-writeRównanie dostaniesz:

x = (w1*w2*(b2 + h2 - b1) + h1*w2*a1 + h2*w1*a2)/(h1*w2 + h2*w1);

Gdy wiesz, że współrzędna x, można używać, aby znaleźć współrzędną y ... Poniżej jest jakiś kod:


private void check() 
    { 
     // Setup variables for shorter notation 
     int w1 = mImg1.getWidth(); 
     int h1 = mImg1.getHeight(); 
     int a1 = mImg1.getLeft(); 
     int b1 = mImg1.getTop(); 

     int w2 = mImg2.getWidth(); 
     int h2 = mImg2.getHeight(); 
     int a2 = mImg2.getLeft(); 
     int b2 = mImg2.getTop(); 

     int x = 0; 
     if(h1*w2 + h2*w1 == 0) 
     { // Return to avoid division by zero 
      return; 
     } 
     else 
     { // Calculate the x-value using the re-written formula 
      x = (w1*w2*(b2 + h2 - b1) + h1*w2*a1 + h2*w1*a2)/(h1*w2 + h2*w1); 
     } 

     // Now use the x-value to calculate the y-value 
     int y = h1/w1 * (x - a1) + b1; 

     Log.d("Output", "x: " + x + " y:" + y);  
    } 

UWAGA: może chcieć ustawić twoje ImageViews na android: width = "wrap_content" i android: height = "wrap_content". W przeciwnym razie obrazy są ustalone zgodnie z wprowadzonym rozmiarem! Testowałem to z ImageView z tłem koła.Jeśli użyjesz wyliczonych współrzędnych x-y, rysuje piłkę w prawo na przecięciu! Powodzenia

+0

Im zrobione z uzyskiwanie współrzędnych, a nawet tworzenie równania liniowego ... po dat wat shud robię, im uderzyłem tam – Lavanya

+0

Zaktualizowałem moją odpowiedź z kodem. Jeśli napotkasz problemy, daj mi znać – Entreco

+0

Czy to rozwiązało problem? – Entreco

Powiązane problemy