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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2009, 02:14   #61
Эмиль_C++
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 61
По умолчанию

(0.5,0.5) и (2.5;4.5) выводит квадрат где нах-ся точка В и тот же самый квадрат пересечения прямой с диагональю. Вот я примерно так хочу сделать..
Код:
#include <iostream.h>
#include <conio.h>      
#include <math.h>
#include <stdlib.h>
#include <dos.h>
#include <stdio.h>
struct point
{float x,y;
};
struct koord
{
float xu;
float yu;
float xd;
float yd;
};

void main()
{  clrscr();
float y,x, s, k, l;
s=1;
int i,j,i1,j1,i2,j2;
struct koord kv[5][5];
  for(i=0;i<5;i++)
  for(j=0;j<5;j++)

 {       kv[i][j].xd=j*s;
	 kv[i][j].yd=i*s;
	 kv[i][j].xu=j*s+s;
	 kv[i][j].yu=i*s+s;
 }
   struct point A,B;
       printf ("Vvedite koord A(x,y)\n");
    scanf ("%f%f",&A.x,&A.y);
       printf ("Vvedite koord B(x,y)\n");
    scanf ("%f%f",&B.x,&B.y);

  float xmin, xmax, ymin, ymax;


  if(A.x<B.x)
  {
    xmin=A.x;
    xmax=B.x;
  }
    else
    {
    xmin=B.x;
    xmax=A.x;
    }

	if(A.y<B.y)
	 {
	   ymin=A.y;
	   ymax=B.y;
	 }
	 else
	 {
	   ymin=B.y;
	   ymax=A.y;
	 }
for(i=0;i<5;i++)
		{


			for(j=0;j<5;j++)
			   {    if(xmin<kv[i][j].xu&&xmin>kv[i][j].xd&&ymin<kv[i][j].yu&&ymin>kv[i][j].yd)
			    printf("Kvadrat tochki A= %d  %d\n",i+1,j+1);
			    i=i1;
			    j=j1;
			     else
				  if(xmax<kv[i][j].xu&&xmax>kv[i][j].xd&&ymax<kv[i][j].yu&&ymax>kv[i][j].yd)
				    { printf ("Kvadrat tochki B= %d  %d\n",i+1,j+1);
				    i=i2;
				    j=j2;
				    }

			   }


		 }

if(B.x!=A.x)
{
	l=(B.y-A.y)/(B.x-A.x);
	for(i=0;i<5;i++)
	{


		for(j=0;j<5;j++)
		{


			k=(kv[i][j].yu-kv[i][j].yd)/(kv[i][j].xu-kv[i][j].xd);
			if(k!=l||-k!=l)
				{
					x=(k*kv[i][j].xd-l*A.x+A.y-kv[i][j].yd)/(k-l);
					y=(((x-kv[i][j].xd)*(kv[i][j].yu-kv[i][j].yd))/(kv[i][j].xu-kv[i][j].xd))+kv[i][j].yd;
				if(x<xmax&&x>xmin&&y<ymax&&y>ymin&&x<kv[i][j].xu&&x>kv[i][j].xd&&y<kv[i][j].yu&&y>kv[i][j].yd)
				 {   if (i+1!=i1&&i+1!=i1&&j+1!=j1&&j+1!=j2)
					printf("Kvadrat %d  %d\n",i+1,j+1);
				 }
				else
				{
					x=(-k*kv[i][j].xu-l*A.x+A.y-kv[i][j].yd)/(-k-l);
					y=(((x-kv[i][j].xu)*(kv[i][j].yu-kv[i][j].yd))/(kv[i][j].xd-kv[i][j].xu))+kv[i][j].yd;
					if(x<xmax&&x>xmin&&y<ymax&&y>ymin&&x<kv[i][j].xu&&x>kv[i][j].xd&&y<kv[i][j].yu&&y>kv[i][j].yd)
					{   if (i!=i1&&i!=i1&&j!=j1&&j!=j2)
						printf("Kvadrat %d  %d\n",i+1,j+1);
					}
				}
			}
			else
			{               if (i+1!=i1&&i+1!=i1&&j+1!=j1&&j+1!=j2)
					printf("Kvadrat %d  %d\n",i+1,j+1);
			}
		}
	}
}
else
 {
 for(i=0;i<5;i++)
   for(j=0;j<5;j++)
if(kv[i][j].xd<xmax && kv[i][j].xu>=xmin && kv[i][j].yd<ymax && kv[i][j].yu>=ymin)
    if (i!=i1&&i!=i1&&j!=j1&&j!=j2)
    printf("Kvadrat %d  %d\n",i+1,j+1);
 }


 if(l==0)
 { for(i=0;i<5;i++)
     { for(j=0;j<5;j++)

		if (kv[i][j].xd<B.x&&kv[i][j].xu>A.x&&kv[i][j].yd<B.y&&kv[i][j].yu>A.y)
	   if (i!=i1&&i!=i1&&j!=j1&&j!=j2)
      printf("Kvadrat %d  %d\n",i+1,j+1);
           
    }
 }
     getch();

}
Эмиль_C++ вне форума Ответить с цитированием
Старый 13.06.2009, 02:19   #62
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Ввел. Вот результат:
Код:
Vvedite koord A(x,y)
0.5 0.5
Vvedite koord B(x,y)
2.5 4.5
Kvadrat tochki A= 1  1
Kvadrat tochki B= 3  5
Kvadrat 1  1
Kvadrat 1  2
Kvadrat 2  2
Kvadrat 2  3
Kvadrat 2  4
Kvadrat 3  4
Kvadrat 3  5
Если не так, то как должно быть?

Цитата:
Вот я примерно так хочу сделать..
Вылезают ошибки. Притом, как я заметил, вы потерли все мои исправления.

Пробуйте вот это:
Код:
#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include <dos.h>
#include <stdio.h>
struct point  // структура точки
{
float x,y;
};
struct koord // структура координат квадрата
{
float xu;
float yu;
float xd;
float yd;
};

int main() //главная функция
{  

float y,x, s, k, l;
s=1; //шаг деления координатной сетки
int i,j;
struct koord kv[5][5]; // создание координатной сетки размерностью 5*5

for(i=0;i<5;i++)
 { 
  for(j=0;j<5;j++)
   {
    kv[i][j].xd=i*s;
    kv[i][j].yd=j*s;
    kv[i][j].xu=i*s+s;
    kv[i][j].yu=j*s+s; 
    printf("KV xd=%.0f, yd=%.0f, xu=%.0f, yu=%.0f\n",kv[i][j].xd, kv[i][j].yd, kv[i][j].xu, kv[i][j].yu);
  } 
 }

struct point A,B; // Ввод координат точек А и В
printf ("Vvedite koord A(x,y)\n");
scanf ("%f%f",&A.x,&A.y);
printf ("Vvedite koord B(x,y)\n");
scanf ("%f%f",&B.x,&B.y);

float xmin, xmax, ymin, ymax;

if(A.x<B.x)
  {
    xmin=A.x;
    xmax=B.x;
  }
else
  {
    xmin=B.x;
    xmax=A.x;
  }

	if(A.y<B.y)
	 {
	   ymin=A.y;
	   ymax=B.y;
	 }
	 else
	 {
	   ymin=B.y;
	   ymax=A.y;
	 }
	 
for(i=0;i<5;i++)
		{
		for(j=0;j<5;j++)
			{
    if(xmin<kv[i][j].xu && xmin>=kv[i][j].xd && ymin<kv[i][j].yu && ymin>=kv[i][j].yd) // если точка принадлежит тому или иному квадрату
			  printf("Kvadrat tochki A= %d  %d\n",i+1,j+1);
		  if(xmax<kv[i][j].xu && xmax>=kv[i][j].xd && ymax<kv[i][j].yu && ymax>=kv[i][j].yd)
				 printf ("Kvadrat tochki B= %d  %d\n",i+1,j+1);
   }
  }

if(B.x!=A.x) // условие- если координаты х точек А и В не равны между собой, то делаем следующие операции
{
l=(B.y-A.y)/(B.x-A.x); // угловой коэффициент прямой
k=(kv[0][0].yu-kv[0][0].yd)/(kv[0][0].xu-kv[0][0].xd); // угловой коэффициент диагонали координатного квадрата

for(i=0;i<5;i++)
	{
	for(j=0;j<5;j++)
	  {
   if(fabs(k)!=fabs(l)) // если коэффициенты не равны по модулю
			{
		 x=(k*kv[i][j].xd-l*A.x+A.y-kv[i][j].yd)/(k-l);
			if(l!=0) y=(((x-kv[i][j].xd)*(kv[i][j].yu-kv[i][j].yd))/(kv[i][j].xu-kv[i][j].xd))+kv[i][j].yd;
			else y = A.y;
			
				if(x<xmax && x>=xmin && y<ymax && y>=ymin && x<kv[i][j].xu && x>=kv[i][j].xd && y<kv[i][j].yu && y>=kv[i][j].yd)
				 {
					printf("Kvadrat %d  %d\n",i+1,j+1);
				 }
				else
				{
					x=(-k*kv[i][j].xu-l*A.x+A.y-kv[i][j].yd)/(-k-l);
					if(l!=0) y=(((x-kv[i][j].xu)*(kv[i][j].yu-kv[i][j].yd))/(kv[i][j].xd-kv[i][j].xu))+kv[i][j].yd;
				 else y= A.y;
				 
    	if(x<xmax&&x>=xmin&&y<ymax&&y>=ymin&&x<kv[i][j].xu&&x>=kv[i][j].xd&&y<kv[i][j].yu&&y>=kv[i][j].yd)
					{
						printf("Kvadrat %d  %d\n",i+1,j+1);
					}
				}
			}
			else
			{
					printf("Kvadrat %d  %d\n",i+1,j+1);
			}
		}
	}
}
else 
 {
 for(i=0;i<5;i++)
   for(j=0;j<5;j++) if(kv[i][j].xd<xmax && kv[i][j].xu>=xmin && kv[i][j].yd<ymax && kv[i][j].yu>=ymin)
    printf("Kvadrat %d  %d\n",i+1,j+1); // вывод координаты квадрата на экран
 }
getch();
return 0;
}
И обязательно ответьте на первый вопрос.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 13.06.2009, 02:22   #63
Эмиль_C++
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 61
По умолчанию

1) вот видите 1 квадрат выводит несколько раз а мне нужно чтоб вывел только 1 раз каждый ,пересеченный прямой, квадрат.
Эмиль_C++ вне форума Ответить с цитированием
Старый 13.06.2009, 02:26   #64
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Уфф... Привожу только измененную часть.

Код:
if(B.x!=A.x) // условие- если координаты х точек А и В не равны между собой, то делаем следующие операции
{
l=(B.y-A.y)/(B.x-A.x); // угловой коэффициент прямой
k=(kv[0][0].yu-kv[0][0].yd)/(kv[0][0].xu-kv[0][0].xd); // угловой коэффициент диагонали координатного квадрата

for(i=0;i<5;i++)
	{
	for(j=0;j<5;j++)
	  {
   if(fabs(k)!=fabs(l)) // если коэффициенты не равны по модулю
			{
		 x=(k*kv[i][j].xd-l*A.x+A.y-kv[i][j].yd)/(k-l);
			if(l!=0) y=(((x-kv[i][j].xd)*(kv[i][j].yu-kv[i][j].yd))/(kv[i][j].xu-kv[i][j].xd))+kv[i][j].yd;
			else y = A.y;
			
				if(x<xmax && x>xmin && y<ymax && y>ymin && x<kv[i][j].xu && x>kv[i][j].xd && y<kv[i][j].yu && y>kv[i][j].yd)
				 {
					printf("Kvadrat %d  %d\n",i+1,j+1);
				 }
				else
				{
					x=(-k*kv[i][j].xu-l*A.x+A.y-kv[i][j].yd)/(-k-l);
					if(l!=0) y=(((x-kv[i][j].xu)*(kv[i][j].yu-kv[i][j].yd))/(kv[i][j].xd-kv[i][j].xu))+kv[i][j].yd;
				 else y= A.y;
				 
    	if(x<xmax&&x>xmin&&y<ymax&&y>ymin&&x<kv[i][j].xu&&x>kv[i][j].xd&&y<kv[i][j].yu&&y>kv[i][j].yd)
					{
						printf("Kvadrat %d  %d\n",i+1,j+1);
					}
				}
			}
			else
			{
					printf("Kvadrat %d  %d\n",i+1,j+1);
			}
		}
	}
}
else 
 {
 for(i=0;i<5;i++)
   for(j=0;j<5;j++) if(kv[i][j].xd<xmax && kv[i][j].xu>xmin && kv[i][j].yd<ymax && kv[i][j].yu>ymin)
    printf("Kvadrat %d  %d\n",i+1,j+1); // вывод координаты квадрата на экран
 }
getch();
return 0;
}
Оно?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 13.06.2009, 02:32   #65
Эмиль_C++
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 61
По умолчанию

скажу так.. вначале выводим квадраты в которых нах-ся точки А и В, потом выводим квадраты которые пересекает прямая БЕЗ ВЫВОДА КВАДРАТОВ КОТОРЫЕ мы уже вывели т.е. без квадратов на которых нах-ся точки А и В. Чтоб не было повторений квадратов.
Эмиль_C++ вне форума Ответить с цитированием
Старый 13.06.2009, 02:35   #66
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Ну так вы код выше проверили? Потестил - вроде, не выводит.
Вот, например:
Код:
Vvedite koord A(x,y)
0.5 0.5
Vvedite koord B(x,y)
2.5 4.5
Kvadrat tochki A= 1  1
Kvadrat tochki B= 3  5
Kvadrat 1  2
Kvadrat 2  2
Kvadrat 2  3
Kvadrat 2  4
Kvadrat 3  4
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 13.06.2009, 06:39   #67
Эмиль_C++
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 61
По умолчанию

У меня почему то выводит все квадраты..
Эмиль_C++ вне форума Ответить с цитированием
Старый 13.06.2009, 12:25   #68
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
У меня почему то выводит все квадраты..
Наверняка что-нибудь не то скопировали..

Вот вам полный исходник.
Вложения
Тип файла: rar test.rar (132.3 Кб, 8 просмотров)
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 13.06.2009, 13:26   #69
Эмиль_C++
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 61
По умолчанию

Вводим значения (1.2:2.4) и (3.2;3.6) выводит квадраты
А 2 3
В 4 4
квадрат 2 3// повторяется
квадрат 3 3
квадрат 3 4
и еще не выводит значения если точка движется параллельно диагонали квадрата т.е. когда у них k=l
Эмиль_C++ вне форума Ответить с цитированием
Старый 13.06.2009, 13:34   #70
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Выход вижу вот где: нужно запоминать квадраты A и B и потом просто сравнивать координаты. Если совпадают, то данный квадрат не выводим.
Цитата:
и еще не выводит значения если точка движется параллельно диагонали квадрата т.е. когда у них k=l
В этом случае можно пересчитывать значение k и брать другую диагональ квадрата.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нахождение трассы движения точки на плоскости Эмиль_C++ Общие вопросы C/C++ 4 20.04.2009 14:26
Анимация движения точки по траектории ariant Microsoft Office Excel 4 25.12.2008 06:28
Уравнение плоскости eoln Помощь студентам 5 27.09.2008 09:22
точки плоскости, заданные своими координатами, попадают в круг с радиусом R Jondeer Общие вопросы C/C++ 6 16.06.2008 00:06
Отбражение чисел - точки, это точки, а не запятые, обозначающие дробную часть Дикий Помощь студентам 7 12.05.2008 17:57