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

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

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

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

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

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

на этот случай надо рассмотреть другую диагональ квадрата-убывающую диагональ т.е. когда к<0 условие if(k!=l||-k!=l) и нахождение точки пересечения при к<0 and pri k>0. А еще частный случай когда прямая вообще не пересекает ни одну из диагоналей то для этого мы и выводим координаты квадратов точек А и В
Эмиль_C++ вне форума Ответить с цитированием
Старый 13.06.2009, 23:00   #92
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

В общем, я так понимаю, теперь все работает?
Цитата:
Сообщение от Эмиль_C++
А еще частный случай когда прямая вообще не пересекает ни одну из диагоналей
Интересно, как такое может быть?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

например если координаты точки А(0.9,0.6) и В(0.2, 1.4) . Когда А.х=В.х программа зависает и не выводит значения, еще если прямая параллельна диагоналям то не выводит значения также зависает

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

Смотрите: вот для приведенных вами значений (А(0.9,0.6) и В(0.2, 1.4)).
Если после ввода координат вывести xmin, xmax, ymin, ymax, то вот что видно:
программа создает новые точки A и B с координатами (0.2, 0.6) и (0.9, 1.4). Думаю, вы понимаете, что это неверно.

Цитата:
программа зависает
Где она у вас зависает? У меня ничего не виснет ни при каких значениях.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

у меня выходит сообщение об ошибке когда я ввожу координаты которые параллельны ОУ и при (0.5;0.5) (3.5;3.5)
Эмиль_C++ вне форума Ответить с цитированием
Старый 14.06.2009, 08:28   #96
Эмиль_C++
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 61
По умолчанию

Квадрат 2 1 вообще не выводит чтоли???? почему то при отрицательном коэффициенте диагонали не все выводит квадраты
Эмиль_C++ вне форума Ответить с цитированием
Старый 14.06.2009, 13:17   #97
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Эмиль_C++
у меня выходит сообщение об ошибке когда я ввожу координаты которые параллельны ОУ и при (0.5;0.5) (3.5;3.5)
Код:
Vvedite koord A(x,y)
0.5 0.5
Vvedite koord B(x,y)
3.5 3.5
Kvadrat tochki A= 1  1
Kvadrat tochki B= 4  4
0.500000 0.500000
3.500000 3.500000
Kvadrat 2  2
Kvadrat 3  3
Эмиль_C++, перечитайте 94-й пост. У вас координаты A и B неверно определяются.

И еще в начале, перед циклами, наверное, нужно исправить:
Код:
if(fabs(k)==fabs(l)) k=(kv[0][0].yd-kv[0][0].yu)/(kv[0][0].xu-kv[0][0].xd);
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

Почему то у меня в Борланде С++ 3.1 выдает ошибку domain и ничего не читает кроме координаты квадратов точек А и В
окончательная программа по-моему вот такая?
Код:
#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, i1,j1,i2,j2;
struct koord kv[5][5];
 kv[0][0].yd=0;
  kv[0][0].xd=0;
  kv[0][0].yu=kv[0][0].yd+s;
  kv[0][0].xu=kv[0][0].xd+s;

  for(j=1;j<5;j++)
     {
      i=0;
      kv[i][j].xd=kv[i][j-1].xu;
      kv[i][j].xu=kv[i][j].xd+s;
      kv[i][j].yd=0;
      kv[i][j].yu=kv[i][j].yd+s;
       }
  for(i=1;i<5;i++)
  {

   for(j=1;j<5;j++)
     {
  
      kv[i][j].xd=kv[0][j].xd;
      kv[i][j].xu=kv[0][j].xu;
    
      kv[i][j].yd=kv[i-1][j].yu;
      kv[i][j].yu=kv[i][j].yd+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;

    xmin=A.x;
    xmax=B.x;
    ymin=A.y;
    ymax=B.y;
	
	 printf ("%f %f %f %f", xmin, xmax, ymin, ymax);
	 
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);
      i1 = i;
      j1 = j;
     }
		  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);
      i2 = i;
      j2 = j;
     }
   }
  }

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); // угловой коэффициент диагонали координатного квадрата
if(fabs(k)==fabs(l)||fabs(-k)==fabs(l))
k=(kv[0][0].yd-kv[0][0].yu)/(kv[0][0].xu-kv[0][0].xd);
for(i=0;i<5;i++)
	{
	for(j=0;j<5;j++)
	  {
		 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)
				 {
				 	if((i!=i1&&j!=j1)&&(i!=i2&&j!=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);
					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)
					{
					 if((i!=i1&&j!=j1)&&(i!=i2&&j!=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<B.x && kv[i][j].xu>=A.x && kv[i][j].yd<B.y && kv[i][j].yu>=A.y)
      if((i!=i1&&j!=j1)&&(i!=i2&&j!=j2)) printf("Kvadrat %d  %d\n",i+1,j+1); // вывод координаты квадрата на экран     
 }
 
if(l==0)
 {
  y = A.y;
  for(i=0;i<5;i++)
     {
      for(j=0;j<5;j++)
       {
        x = A.x + kv[i][j].xd;
        if(x<xmax&&x>=xmin&&x<kv[i][j].xu&&x>=kv[i][j].xd&&y<kv[i][j].yu&&y>=kv[i][j].yd)
         if(!(i==i1&&j==j1) && !(i==i2&&j==j2))
	         printf("Kvadrat %d  %d\n",i+1,j+1);
        }
     }
 }
 
getch();
return 0;

}

Последний раз редактировалось Sazary; 14.06.2009 в 23:32.
Эмиль_C++ вне форума Ответить с цитированием
Старый 14.06.2009, 23:34   #99
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Проверьте этот блок:
Код:
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;
Возможно, при каких-то значениях здесь происходит деление на ноль.

Цитата:
окончательная программа по-моему вот такая?
У меня работает некорректно. В отличие от предыдущего варианта.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

ну я же вроде исправил выше сказанные вами ошибки. Когда они движутся параллельно то какое условие можно использовать? чтоб вывести координаты квадратов которые прямая пересекает?

Последний раз редактировалось Эмиль_C++; 15.06.2009 в 00:12.
Эмиль_C++ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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