Вектор , отрезок через класс Vector

Тема в разделе "Java", создана пользователем Yunnii, 14 окт 2008.

  1. Yunnii

    Yunnii Гость

    Создание отрезка через вектор, тока мы дописали эту задачу так у нас потребовали осуществление через класс Vector. Как делать? Подскажите
    Отрезок

    Код (Text):
    package immutableClasses;
    import java.io.*;


    public class Segment {


    final Vector v1=new Vector();
    final Vector v2=new Vector();
    public Segment(double x1, double y1, double z1,double x2, double y2, double z2) {      
    v1.x=x1;
    v1.y=y1;
    v1.z=z1;
    v2.x=x2;
    v2.y=y2;
    v2.z=z2;       
    }

    public double distance(double x1, double y1, double z1){
    final Vector a=new Vector();
    final Vector b=new Vector();
    final Vector c=new Vector();
    double p=0;
    a.x=v1.x-v2.x;
    a.y=v1.y-v2.y;
    a.z=v1.z-v2.z;

    b.x=v1.x-x1;
    b.y=v1.y-y1;
    b.z=v1.z-z1;

    c.x=x1-v2.x;
    c.y=y1-v2.y;
    c.z=z1-v2.z;

    double a_d=a.dlina(a);

    double b_d=b.dlina(b);
    double c_d=c.dlina(c);


    System.out.println("координаты отрезка:"+a.x+' '+a.y+' '+a.z);
    p=(a_d+b_d+c_d)/2;
    double rasst=0;
    if(a.Ugol(b)<0)
    {
    System.out.println("расстояние от точки до прямой:"+b_d);
    return b_d;            
    }
    if(a.Ugol(c)<0)
    {
    System.out.println("расстояние от точки до прямой:"+c_d);
    return c_d;            
    }
    if(a_d!=0 && (b_d+c_d)!=a_d)
    {
    rasst=(2*Math.sqrt(p*(p-a_d)*(p-b_d)*(p-c_d)))/a_d;
    }
    System.out.println("расстояние от точки до прямой:"+rasst);
    return rasst;      
    }

    public static String readLine()
    {
    try
    {
    return new BufferedReader(
    new InputStreamReader(System.in)).readLine();
    }
    catch (IOException e)
    {
    return new String();
    }
    }

    public static void main (String[] args)
    {

    //     

    final Vector a1=new Vector();
    final Vector a2=new Vector();
    Vector c=new Vector();
    int count=0;

    System.out.println("Введите координаты векторов:");
    String str = readLine();

    double number = new Double(str).intValue();
    a1.x=number;
    str = readLine();
    number = new Double(str).intValue();
    a1.y=number;
    str = readLine();
    number = new Double(str).intValue();
    a1.z=number;
    str = readLine();
    number = new Double(str).intValue();
    a2.x=number;
    str = readLine();
    number = new Double(str).intValue();
    // number = new Integer(str).intValue();
    a2.y=number;
    str = readLine();
    number = new Double(str).intValue();
    a2.z=number;

    c=a1.summa(a2);
    //  System.out.println("сума:"+ c.x);
    //  System.out.println("скалярное произведение:"+a1.skal_pr(a2));

    //  final Segment n=new Segment(a1.x,a1.y,a1.z,a2.x,a2.y,a2.z);

    //n.distance(1,2,4);

    }

    }
    Вектор
    Код (Text):
    package immutableClasses;
    import java.io.*;

    class Vector {
    double x; double y; double z;
    Vector()
    {
    x=0;
    y=0;
    z=0;
    }
    Vector(double ax, double ay, double az){
    x=ax;
    y=ay;
    z=az;
    }


    @Override
    public boolean equals(Object obj) {
    if (this == obj)
    return true;
    if (obj == null)
    return false;
    if (getClass() != obj.getClass())
    return false;
    final Vector other = (Vector) obj;
    if (Double.doubleToLongBits(x) != Double.doubleToLongBits(other.x))
    return false;
    if (Double.doubleToLongBits(y) != Double.doubleToLongBits(other.y))
    return false;
    if (Double.doubleToLongBits(z) != Double.doubleToLongBits(other.z))
    return false;
    return true;
    }
    double dlina(Vector a)
    {  
    return Math.sqrt(a.x*a.x+a.y*a.y+a.z*a.z);

    }
    Vector summa(Vector b)
    {
    Vector c=new Vector();
    c.x=x+b.x;
    c.y=y+b.y;
    c.z=z+b.z;
    return c;
    }
    Vector raznost( Vector b)
    {
    Vector c=new Vector();
    c.x=x-b.x;
    c.y=y-b.y;
    c.z=z-b.z;
    return c;
    }
    Vector umn_na_skal(Vector a, double b)
    {
    Vector c=new Vector();
    c.x=a.x*b;
    c.y=a.y*b;
    c.z=a.z*b;
    return c;
    }
    double skal_pr(Vector b)
    {
    double c=x*b.x+y*b.y+z*b.z;
    return c;
    }
    Vector Vekt_pr(Vector v2)
    {
    Vector result = new Vector();
    result.x = y * v2.z - z * v2.y;
    result.y = z * v2.x - x * v2.z;
    result.z = x * v2.y - y * v2.x;
    return result;
    }
    double Ugol(Vector b)
    {
    double c=(x*b.x+y*b.y+z*b.z)/(Math.sqrt(x*x+y*y+z*z)*Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z));
    return c;
    }

    }
    Тест
    Код (Text):
    package immutableClasses;
    import java.io.*;

    import junit.framework.TestCase;

    public class SegmentTest extends TestCase {
    // ТЕСТ: Точка лежит на отрезке
    public void testPointOnSegment() {
    check(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    check(0, 0, 0, 1, 1, 1, 0, 0, 0, 0);
    check(0, 0, 0, 2, 4, 8, 1, 2, 4, 0);
    check(0, 0, 0, 1, 2, 0, 1, 2, 0, 0);
    check(10, -1, 2, 0, 1, 4, 5, 0, 3, 0);
    }

    // ТЕСТ: Проекция точки на отрезок совпадает с одним из концов отрезка
    public void testPointUnderEnd(){
    check(0, 0, 0, 1, 0, 0, 0, 1, 0, 1);
    check(-1, 0, 0, 1, 0, 0, -1, 1, 0, 1);
    check(-1, 0, 0, 1, 0, 0, 1, 0, 10.1, 10.1);    
    }

    // ТЕСТ: Проекция точки на отрезок лежит внутри отрезка
    public void testPointUnderSegment(){
    check(0, 0, 0, 10, 0, 0, 3, 12, 0, 12);
    check(-1, 0, 0, 1, 0, 0, 0, 3, 4, 5);
    check(-1, -1, 0, 2, 2, 0, 1, 1, 4, 4); 
    }

    // ТЕСТ: Проекция точки на отрезок лежит вне отрезка
    public void testPointNotUnderSegment(){
    check(0, 0, 0, 10, 0, 0, 13, 4, 0, 5);
    check(0, 0, 0, 10, 0, 0, -3, -4, 0, 5);
    }

    public void check(double x1, double y1, double z1, double x2, double y2,
    double z2, double x, double y, double z, double expectedDistance) {
    Segment s = new Segment(x1, y1, z1, x2, y2, z2);
    assertEquals(expectedDistance, s.distance(x, y, z), 0.000001);
    }

    public void testSum(){
    Vector v1=new Vector(0,1,0);
    Vector v2=new Vector(0,0,1);
    Vector v3=new Vector(0,1,1);
    assertTrue(v3.equals(v1.summa(v2)));
    }
    public void testRaz(){
    Vector v1=new Vector(0,1,0);
    Vector v2=new Vector(0,0,1);
    Vector v3=new Vector(0,1,-1);
    assertTrue(v3.equals(v1.raznost(v2)));
    }
    public void testSP(){
    Vector v1=new Vector(4,1,3);
    Vector v2=new Vector(0,2,1);
    double c=5;
    assertTrue(c==v1.skal_pr(v2));
    }
    public void testVP(){
    Vector v1=new Vector(0,1,0);
    Vector v2=new Vector(0,0,1);
    Vector v3=new Vector(1,0,0);
    assertTrue(v3.equals(v1.Vekt_pr(v2)));
    }  
    public void testSc(){
    Vector v1=new Vector(1,4,-2);
    double c=3;
    Vector v3=new Vector(3,12,-6);
    assertTrue(v3.equals(v1.umn_na_skal(v1,c)));
    }
    }
     
  2. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.018
    Симпатии:
    1
    так в чем собственно вопрос?
     
  3. Yunnii

    Yunnii Гость

    фишка в том что я не знаю как это сделать через встроенный класс vector и как замутить тестыю хотя бы приблизетельно понятькак это сделать.. :)
     
Загрузка...

Поделиться этой страницей