Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2010, 21:02   #1
PastoriXx
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 40
Печаль Пересечение линий

Определить класс Line дляпрямых линий, проходящих через точки А(х1,у1) и В(х2,у2).Создать массив обьектов класса Line. Определить какие из прямых линий пересекаются а какие совпадают. Нарисовать все пересекающиеся прямые.
Я написал алгоритм, вроде правильно, но не могу сделать правильно прорисовку линий. Рисуется только вторая(
Вот что я написал:
Код:
	public class Line extends Applet{

	int N = 2;
	int[][] A = new int[N][2]; 
	int[][] B = new int[N][2];
	int Y,U,X;
	
	Random a = new Random();
	Date d = new Date(4);
	
	public void paint(Graphics g)
	{
		
		A[0][0] = 1; A[0][1] = 1;
		A[1][0] = 100; A[1][1] = 1;
		//A[2][0] = 1; A[2][1] = 1;
		//A[3][0] = 1; A[3][1] = 1;
		//A[4][0] = 1; A[4][1] = 1;
		B[0][0] = 500; B[0][1] = 500;
		B[1][0] = 2000; B[1][1] = 1000;
		//B[2][0] = 5; B[2][1] = 5;
		//B[3][0] = 5; B[3][1] = 5;
		//B[4][0] = 5; B[4][1] = 5;
		
		
		
		//for(int i=0; i<N;i++)
			//for(int j=0; j<=1;j++)
			//{
			//	A[i][j]=a.nextInt(200);
			//	B[i][j]=a.nextInt(100);
			//}
		
		for(int i=0; i<N;i++)
			for(int j=i+1; j<N;j++)
				//for(int k=0; k<N;k++)
				{
					
					X = (B[i][0]-A[i][0])*(B[j][1]-A[j][1])-(B[i][1]-A[i][1])*(B[j][0]-A[j][0]);
					if(X!=0)
					{
					Y = (A[i][1]-A[j][1])*(B[j][0]-A[j][0])-(A[i][0]-A[j][0])*(B[j][1]-A[j][1]);
					U = (A[i][1]-A[j][1])*(B[i][0]-A[i][0])-(A[i][0]-A[j][0])*(B[i][1]-A[i][1]);
					double r = Y / X;
		            double s = U / X;

		            if (r >= 0 && r <= 1 && s >= 0 && s <= 1)

					//Y = (k-A[i][0])*(B[i][1]-A[i][1])/(B[i][0]-A[i][0])+A[i][1];
					//U = (k-A[j][0])*(B[j][1]-A[j][1])/(B[j][0]-A[j][0])+A[j][1];
					//if(Y==U)
						for(int h=0; h<N;h++)
							g.drawLine(A[i][0], A[j][1], B[j][0], B[i][1]);
				
					}
				}
	}
}
PastoriXx вне форума Ответить с цитированием
Старый 19.12.2010, 09:15   #2
PastoriXx
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 40
По умолчанию

Код:
	public class Line extends Applet{

	int N = 5;
	int[][] A = new int[N][2]; 
	int[][] B = new int[N][2];
	int Y,U,X;
	
	Random a = new Random();
	Date d = new Date(4);
	
	public void paint(Graphics g)
	{
		
		//A[0][0] = 0; A[0][1] = 0;
		//A[1][0] = 0; A[1][1] = 50;
		//A[2][0] = 500; A[2][1] = 500;
		//A[3][0] = 1000; A[3][1] = 100;
		//A[4][0] = 1; A[4][1] = 1000;
		//B[0][0] = 500; B[0][1] = 500;
		//B[1][0] = 2000; B[1][1] = 1000;
		//B[2][0] = 600; B[2][1] = 600;
		//B[3][0] = 500; B[3][1] = 5000;
		//B[4][0] = 100; B[4][1] = 1000;
		
		
		
		for(int i=0; i<N;i++)
			for(int j=0; j<=1;j++)
			{
				A[i][j]=a.nextInt(200);
				B[i][j]=a.nextInt(100);
			}
		
		for(int i=0; i<N;i++)
			for(int j=i+1; j<N;j++)
				//for(int k=0; k<N;k++)
				{
					
					X = (B[i][0]-A[i][0])*(B[j][1]-A[j][1])-(B[i][1]-A[i][1])*(B[j][0]-A[j][0]);
					if(X!=0)
					{
					Y = (A[i][1]-A[j][1])*(B[j][0]-A[j][0])-(A[i][0]-A[j][0])*(B[j][1]-A[j][1]);
					U = (A[i][1]-A[j][1])*(B[i][0]-A[i][0])-(A[i][0]-A[j][0])*(B[i][1]-A[i][1]);
					double r = Y / X;
		            double s = U / X;

		            if (r >= 0 && r <= 1 && s >= 0 && s <= 1)
		            {
					//Y = (k-A[i][0])*(B[i][1]-A[i][1])/(B[i][0]-A[i][0])+A[i][1];
					//U = (k-A[j][0])*(B[j][1]-A[j][1])/(B[j][0]-A[j][0])+A[j][1];
					//if(Y==U)
							g.drawLine(A[i][0], A[i][1], B[i][0], B[i][1]);
		            		g.drawLine(A[j][0], A[j][1], B[j][0], B[j][1]);
		            }
					}
				}
	}
}
Алгоритм касячит где то((( Помогите!!!
PastoriXx вне форума Ответить с цитированием
Старый 19.12.2010, 11:26   #3
andrewpalkin
Форумчанин
 
Аватар для andrewpalkin
 
Регистрация: 23.11.2010
Сообщений: 458
По умолчанию

Можешь выложить весь код ?
--- Если я вам помог , то помогите и вы мне . Не просто просите решить задачу , а пробуйте ее сами решить ! Я не пишу программы с нуля , я помогаю поправить код ! ---
andrewpalkin вне форума Ответить с цитированием
Старый 22.12.2010, 15:45   #4
PastoriXx
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 40
По умолчанию

Вот отсутствующий кусок
Код:
import java.awt.Graphics;
import java.applet.*;
import java.awt.*;
import java.sql.Date;
import java.util.Random;
PastoriXx вне форума Ответить с цитированием
Старый 22.12.2010, 16:54   #5
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Я бы предложил сделать несколько иначе: два класса. Один это класс линии, второй это класс графического отображения.
Код:
import java.awt.Dimension;

public class Line {

    private int x1;
    private int y1;
    private int x2;
    private int y2;

    Line(int x1, int y1, int x2, int y2){
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
    }
    //проверка наложения прямых
    public boolean isCoincidence(Line l){
        return (y2 - y1)/(x2 - x1) == (l.y2 - l.y1)/(l.x2 - l.x1) &&
                (y2 - y1)/(x2 - x1)*(-x1) + y1 == (l.y2 - l.y1)/(l.x2 - l.x1)*(-l.x1) + l.y1;
    }
    //проверка параллельности прямых
    public boolean isParallelism(Line l){
        return (y2 - y1)/(x2 - x1) == (l.y2 - l.y1)/(l.x2 - l.x1) &&
                (y2 - y1)/(x2 - x1)*(-x1) + y1 != (l.y2 - l.y1)/(l.x2 - l.x1)*(-l.x1) + l.y1;
    }
    //проверка пересечения прямых
    public boolean isIntersection(Line l){
        return !isParallelism(l);
    }
    //возврадает y(x) для рисования прямой
    public int getY(int x){
        return ((y2 - y1)/(x2 - x1))*(x - x1) + y1;
    }
    //точка А
    public Dimension getA() { return new Dimension(x1, y1); }
    //точка B
    public Dimension getB() { return new Dimension(x2, y2); }

    @Override
    public String toString(){
        return "A("+x1+","+y1+") B("+x2+","+y2+")\n";
    }
}
Код:
import java.applet.Applet;
import java.awt.Graphics;
import java.util.Random;

public class Main extends Applet{

    Line [] lines = new Line[6];
    
    @Override
    public void init(){
        Random r = new Random();
        for(int i = 0; i < lines.length; i++)
            lines[i] = new Line(r.nextInt(getWidth()), r.nextInt(getHeight()),
                    r.nextInt(getWidth()), r.nextInt(getHeight()));

    }

    @Override
    public void paint(Graphics g){

        for(int i = 0; i < lines.length; i++)
            for(int j = i + 1; j < lines.length; j++){
                if(lines[i].isIntersection(lines[j])){
                    for(int k = 0; k < getWidth(); k++){
                        g.drawRect(k, lines[i].getY(k), 1, 1);
                        g.drawRect(k, lines[j].getY(k), 1, 1);
                    }
                    System.out.println("Линии пересекаются:\n"+lines[i]+lines[j]);
                }
                if(lines[i].isCoincidence(lines[j]))System.out.println("Линии "
                        + "совпадают:\n"+lines[i]+lines[j]);
                if(lines[i].isParallelism(lines[j]))System.out.println("Линии "
                        + "параллельны:\n"+lines[i]+lines[j]);
                }
    }
}

Последний раз редактировалось BleStaR; 22.12.2010 в 16:58.
BleStaR вне форума Ответить с цитированием
Старый 22.12.2010, 16:54   #6
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Я бы предложил сделать несколько иначе: два класса. Один это класс линии, второй это класс графического отображения.
Код:
import java.awt.Dimension;

public class Line {

    private int x1;
    private int y1;
    private int x2;
    private int y2;

    Line(int x1, int y1, int x2, int y2){
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
    }
    //проверка наложения прямых
    public boolean isCoincidence(Line l){
        return (y2 - y1)/(x2 - x1) == (l.y2 - l.y1)/(l.x2 - l.x1) &&
                (y2 - y1)/(x2 - x1)*(-x1) + y1 == (l.y2 - l.y1)/(l.x2 - l.x1)*(-l.x1) + l.y1;
    }
    //проверка параллельности прямых
    public boolean isParallelism(Line l){
        return (y2 - y1)/(x2 - x1) == (l.y2 - l.y1)/(l.x2 - l.x1) &&
                (y2 - y1)/(x2 - x1)*(-x1) + y1 != (l.y2 - l.y1)/(l.x2 - l.x1)*(-l.x1) + l.y1;
    }
    //проверка пересечения прямых
    public boolean isIntersection(Line l){
        return !isParallelism(l);
    }
    //возврадает y(x) для рисования прямой
    public int getY(int x){
        return ((y2 - y1)/(x2 - x1))*(x - x1) + y1;
    }
    //точка А
    public Dimension getA() { return new Dimension(x1, y1); }
    //точка B
    public Dimension getB() { return new Dimension(x2, y2); }

    @Override
    public String toString(){
        return "A("+x1+","+y1+") B("+x2+","+y2+")\n";
    }
}
Код:
import java.applet.Applet;
import java.awt.Graphics;
import java.util.Random;

public class Main extends Applet{

    Line [] lines = new Line[6];
    
    @Override
    public void init(){
        Random r = new Random();
        for(int i = 0; i < lines.length; i++)
            lines[i] = new Line(r.nextInt(getWidth()), r.nextInt(getHeight()),
                    r.nextInt(getWidth()), r.nextInt(getHeight()));

    }

    @Override
    public void paint(Graphics g){

        for(int i = 0; i < lines.length; i++)
            for(int j = i + 1; j < lines.length; j++){
                if(lines[i].isIntersection(lines[j])){
                    for(int k = 0; k < getWidth(); k++){
                        g.drawRect(k, lines[i].getY(k), 1, 1);
                        g.drawRect(k, lines[j].getY(k), 1, 1);
                    }
                    System.out.println("Линии пересекаются:\n"+lines[i]+lines[j]);
                }
                if(lines[i].isCoincidence(lines[j]))System.out.println("Линии "
                        + "совпадают:\n"+lines[i]+lines[j]);
                if(lines[i].isParallelism(lines[j]))System.out.println("Линии "
                        + "параллельны:\n"+lines[i]+lines[j]);
                }
    }
}

Последний раз редактировалось BleStaR; 22.12.2010 в 16:57.
BleStaR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пересечение линий на графике EXCEL 666buster666 Microsoft Office Excel 10 26.10.2011 15:16
Прорисовка линий макрасом konistra Microsoft Office Excel 13 02.06.2010 21:45
Все стили линий dan1el Общие вопросы Delphi 3 24.05.2010 00:16
C. Найти пересечения линий. Sekmegalife Помощь студентам 1 19.10.2009 08:34
соединив шесть линий... alex(21) Паскаль, Turbo Pascal, PascalABC.NET 6 11.06.2009 16:55