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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2010, 13:22   #1
kochet-kov
Пользователь
 
Регистрация: 17.12.2010
Сообщений: 19
Вопрос ГЕОМЕТРИЧЕСКАЯ ЗАДАЧА С++

Составить программу, отображающую на экране дисплея в текстовом режиме исходные данные и требуемые результаты. Реализовать ввод исходных данных следующими способами по выбору пользователя:
1. Вручную с клавиатуры;
2. С помощью генератора псевдослучайных чисел.

На плоскости координатами своих упорядоченных вершин задан произвольный многоугольник без самопересечения и точка А вне многоугольника. Определить число вершин, видимых из точки А



как я понял нужно соединить эту точку с вершинами
если какая-то прямая пересекает сторону(до этой вершины ) многоугольника , то не видна точка
Тут весь вопрос, как определить пересечение.




пока сделал вот это:
Код:
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "math.h"
#include "time.h"


int _tmain(int argc, _TCHAR* argv[])
{
int n, answ;
int i;
printf("vvedite kolichestvo toghek:");
scanf("%i",&n);
char ch;
do
{
	 printf("Zadat elementi sluchaino&(1/2)");
	 scanf("%d", &answ);
		 answ=getch(); printf("%c\n", answ);
} while((answ!='y')&&(answ!='n'));
int* X= new int[n];
int* Y= new int[n];
 if (answ=='y')
 {
	
	 for(i=0; i<n; i++)
	 { X[i]= rand();
	 Y[i]=rand();
	 printf("(X[%i],Y[%i])= (%i,%i)\n", i+1, i+1, X[i],Y[i]);
	 }
 }
 else
 {
	  for(i=0; i<n; i++)
	  {
		  printf("Vvedite element X[%i]= ", i);
		  scanf("%i", &X[i]);
	      printf("Vvedite element Y[%i]= ", i);
		  scanf("%i", &Y[i]);
	  }
 }
	
getch();

return 0;
}
kochet-kov вне форума Ответить с цитированием
Старый 21.12.2010, 08:23   #2
andrewpalkin
Форумчанин
 
Аватар для andrewpalkin
 
Регистрация: 23.11.2010
Сообщений: 458
По умолчанию

Как определить что они пересекаются , это тебе не программирование надо сейчас в помощь , а математику ... Просто проверять все прямые как ты и сказал , соединив твою точку со всеми вершинами . Но вот формула для проверки всего этого математически я не помню

Но идея у тебя правильная !!!!
--- Если я вам помог , то помогите и вы мне . Не просто просите решить задачу , а пробуйте ее сами решить ! Я не пишу программы с нуля , я помогаю поправить код ! ---
andrewpalkin вне форума Ответить с цитированием
Старый 21.12.2010, 12:20   #3
KEA0301
Пользователь
 
Регистрация: 20.12.2010
Сообщений: 28
По умолчанию

Пересечение прямых определяется примерно так: составляется уравнение каждой прямой, и решается система из 2-х уравнений и 2-х неизвестных и решая ее находишь точку пересечения, нужно будет исключить решение вне грани многоугольника, и если решением является точка, к которой проведен отрезок из А.
KEA0301 вне форума Ответить с цитированием
Старый 21.12.2010, 12:33   #4
kochet-kov
Пользователь
 
Регистрация: 17.12.2010
Сообщений: 19
По умолчанию

это я понял, но как исключить пересечения вне многоугольника?
kochet-kov вне форума Ответить с цитированием
Старый 21.12.2010, 18:04   #5
KEA0301
Пользователь
 
Регистрация: 20.12.2010
Сообщений: 28
По умолчанию

Цитата:
Сообщение от kochet-kov Посмотреть сообщение
это я понял, но как исключить пересечения вне многоугольника?
Если точка пересечения лежит на отрезке от B(x1;y1) до C(x2;y2), то её координаты должны (x,y) удовлетворяют условию:
min(x1,x2)<=x<=max(x1,x2)
min(y1,y2)<=y<=max(y1,y2)
И так в цикле для каждой точке составляешь уравнение прямой от А до этой точки, во вложенном цикле проверяешь по всем прямым многоугольника принадлежит ли какая нибудь точка пересечения на отрезке, и если такой не нашлось то значит из А эту точку видно.
KEA0301 вне форума Ответить с цитированием
Старый 21.12.2010, 18:32   #6
kochet-kov
Пользователь
 
Регистрация: 17.12.2010
Сообщений: 19
По умолчанию

так, это понял..
но для начала мне нужно отсортировать точки так, что бы получался многоугольник без самопересечения. для этого
Находим нижнюю точку - min(y) (если их несколько, то берем любую)
Её координаты - (x0,y0)
Остальной массив сортируем по возрастанию значения (xi-x0)/(yi-y0)

но компилятор ругается(
Код:
int x0,y0;
x0=X[index_niznei_grani];
y0=Y[index_niznei_grani];
int* k= new int[n];
 for (i=0;i<n; i++)
 {	 k[i]=(((X[i]-x0))/((Y[i]-y0)));
 printf(" k[%i]=%i\n",i+1,k[i]);
 }
в этом участке кода где-то ошибка

Последний раз редактировалось kochet-kov; 21.12.2010 в 18:42.
kochet-kov вне форума Ответить с цитированием
Старый 21.12.2010, 19:11   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но компилятор ругается
Что такими словами что приводить стыдно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.12.2010, 19:20   #8
kochet-kov
Пользователь
 
Регистрация: 17.12.2010
Сообщений: 19
По умолчанию

да, нет уже нашел ошибку.. на 0 не делит...
kochet-kov вне форума Ответить с цитированием
Старый 22.12.2010, 18:39   #9
kochet-kov
Пользователь
 
Регистрация: 17.12.2010
Сообщений: 19
По умолчанию

я переделал начало программы..
теперь мне нужно отсортировать точки по алгоритму Джарвиса.. кто может с этим помочь?
Код:
#include <stdafx.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>

//структура точка
struct Point {
  int x, y;
};





int main()
{
	
	Point *Points;
   Point *A;
	double *sDist, min;
	int N = 0, i, j, R1 = 0, R2 = 0, index = 0;
	bool flag = true;
	char ch;
	
	printf("Vvedite kol-vo tochek na ploskosti ");
	scanf("%d", &N);

	Points = new Point[N];
	sDist = new double[N];
      A=new Point[1];
	//Цикл пока не будет нажата y или n
	do {
		printf("Zadat elementi sluchaino?(y/n) ");
		scanf("%c", &ch);
		ch = getch(); printf("%c\n", ch);
	
	}while((ch != 'y')&&(ch != 'n'));

	//Если была нажата y
	if (ch == 'y'){
	srand((int)time(NULL));
	printf("Vvedite predel generacii dla tochek  ");
	scanf("%d %d", &R1, &R2); 

		for (i = 0; i < N; i++) {
          Points[i].x = rand() % (R2 - R1) + R1;
          Points[i].y = rand() % (R2 - R1) + R1;
          printf("Tochka %d: (%d, %d)\n", i+1, Points[i].x, Points[i].y );
        }
          A[1].x = rand() % (R2 - R1) + R1;
          A[1].y = rand() % (R2 - R1) + R1;
	printf("Tochka A: (%d, %d)\n", A[1].x, A[1].y );
	}
	else { //Если была нажата n
	printf("Zadaite koordinati tochkami\n ");

        for (i = 0; i < N; i++) {
			printf("Tochka %d ", i+1);
		  scanf("%d %d", &Points[i].x, &Points[i].y);
        }
	printf("Tochka A ");
		  scanf("%d %d", &A[1].x, &A[1].y);
	}


	//найдем самую левую из самых нижних
	
		int miny,minx, index_niznei_grani,index_samogo_levogo_iz_niznih;
       
	  miny =  Points[0].y;
	  minx=  Points[0].x;
      index_niznei_grani = 0;
	  index_samogo_levogo_iz_niznih = 0;
           for(i=0; i<N; ++i) 
		   {
              if(miny > Points[i].y) {
                       miny  = Points[i].y;
	                   index_niznei_grani= i;	
					   
                     }	 
                   }   
            for (j=0; j<N ; j++)
					   {if (Points[i].y ==  miny && minx > Points[i].x) 
                        minx = Points[i].x;
					   index_samogo_levogo_iz_niznih= i;}

printf("Tochka %i samaya levaya iz samixniznih: (%d, %d)\n",  Points[index_samogo_levogo_iz_niznih].x,  Points[index_niznei_grani+1].y );

если конкретнее на данном этапе на получается найти самую левую из самых нижних точку
Код:
//найдем самую левую из самых нижних
	 
		int miny,minx, index_niznei_grani,index_samogo_levogo_iz_niznih;
       
	  miny =  Points[0].y;
	  minx=  Points[0].x;
      index_niznei_grani = 0;
	  index_samogo_levogo_iz_niznih = 0;
           for(i=0; i<N; ++i) 
		   {
              if(miny > Points[i].y) {
                       miny  = Points[i].y;
	                   index_niznei_grani= i;	
					   
                     }	 
                   }   
            for (j=0; j<N ; j++)
					   {if (Points[i].y ==  miny && minx > Points[i].x) 
                        minx = Points[i].x;
					   index_samogo_levogo_iz_niznih= i;}

printf("Tochka %i samaya levaya iz samixniznih: (%d, %d)\n",  Points[index_samogo_levogo_iz_niznih].x,  Points[index_niznei_grani+1].y );
kochet-kov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Геометрическая задача в VS2010 С++ FEAREX Помощь студентам 7 17.12.2010 09:53
Геометрическая задача!!! (1 курс, дельфи) Movek Помощь студентам 1 03.10.2010 19:21
Геометрическая задача HackNick Общие вопросы C/C++ 5 02.09.2010 20:49
Олимиадная геометрическая задача по программированию zmiter Помощь студентам 3 04.06.2009 13:44
Геометрическая задача С++ bloo[d] Общие вопросы C/C++ 9 30.01.2008 18:27