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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2009, 00:11   #101
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
    xmin=A.x;
    xmax=B.x;
    ymin=A.y;
    ymax=B.y;
Это не называется "исправить". И работать будет только если точка А ниже и левее точки B.

Пробуйте. У меня работает если прямая параллельна диагонали или оси x.
Код:
#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]; // создание координатной сетки размерностью 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;

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);
      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)) k=(kv[0][0].yd-kv[0][0].yu)/(kv[0][0].xd-kv[0][0].xu);
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;
  x = A.x;
 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 вне форума Ответить с цитированием
Старый 15.06.2009, 00:22   #102
Эмиль_C++
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 61
По умолчанию

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

Цитата:
Сообщение от Эмиль_C++
да! когда прямая параллельно оси у меня выводит результат!!! ...только почему то когда параллельна диагонали нет...
Ну что я могу еще сказать?
Код:
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
Kvadrat 2  2
Kvadrat 3  3
Может, глюк компилятора..
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

можете программу в виде файла скинуть?
Эмиль_C++ вне форума Ответить с цитированием
Старый 15.06.2009, 00:45   #105
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

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

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
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