Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C] Координаты точек


Автор: Гениальный123Робот 8.11.2006, 00:42
Уважаемые господа, кто хорошо в математике разбирается, составьте 4 таких вот функции:

1) Получения декартовых координат точки, если заданы её полярные координаты.
2) Получения полярных координат точки, если заданы её декартовые координаты.
3) Вычисления расстояния между двумя точками, заданными в декартовой системе координат. 
4) Вычисления расстояния между двумя точками, заданными в полярной системе координат. 

Ну или хотя бы кто что сможет. 

Автор: cardinal 8.11.2006, 00:54
Вопрос: речь идет о 2D?

Автор: Гениальный123Робот 8.11.2006, 00:59
Цитата(cardinal @ 8.11.2006,  00:54)
Вопрос: речь идет о 2D?

Ты знаешь, в условии не оговорено... Ни слова об этом не сказано... Даже не знаю...
Но рассмотрим двухмерное, навреное. Хватит пока. 

Автор: cardinal 8.11.2006, 01:10
Ресь идет о 2D. Извиняюсь за глупый вопрос...

1.
2.
см. тут
http://www.relativity.ru/issues/coords.shtml
и тут (лучше тут - картинки красивее smile )
http://algolist.manual.ru/maths/geom/coord.php

Цитата(Гениальный123Робот @  7.11.2006,  23:42 Найти цитируемый пост)
3) Вычисления расстояния между двумя точками, заданными в декартовой системе координат. 
4) Вычисления расстояния между двумя точками, заданными в полярной системе координат. 

см. длина вектора (который объединяет эти точки)

Автор: Гениальный123Робот 8.11.2006, 15:17
cardinal, как я понял, 

для 1) и 2) мне достаточно вот этого:

Формулы для перехода от полярных координат к декартовым 
x=ρ*cos(φ), 
y=ρ*sin(φ)

и обратно: 
ρ=sqrt(x2)+y2), 
φ=arctg(y/x)=arcsin(y/ρ)


для 4) выразить _р (РО) через все заданное..

для 3) я чуток не понял. или прямоугольные координаты - это и есть декартовы координаты? Если да, то как там выразить этот вектор..? 

Автор: zhenium 8.11.2006, 16:21
Ну в декартовых координатах совсем просто! Они же и прямоугольные.
Сейчас объясню... Правда, не знаю, как тут рисунок прикреплять, поэтому придётся на пальцах объяснять.

Пусть есть 2 точно A(x_1; y_1) и B(x_2; y_2). В них x_2 > x_1 и y_2 > y_1, но это, как ты далее убедишься, не принципиально.
Тогда длина вектора, она же расстояние между двумя точками, будет выглядеть так:

s^2 = ( x_2 - x_1 )^2 + ( y_2 - y_1 )^2, где ^2 - возведение в квадрат, т.е. вся формула есть не что иное как теорема Пифагора. Просто затем находишь квадратный корень из s 

s = sqrt( ( x_2 - x_1 )^2 + ( y_2 - y_1 )^2 ), где sqrt() - кв.корень.

Тут не принципиально, вычитают ли x_2 из x_1 или наоборот ( также и для y ), т.к. всё равно возводим в квадрат, минус если в разности и появится, сам понимаешь, затем исчезнет!

P.S. Постараюсь найти у себя и ответ на пункт 4. И ещё. В пунктах 1 и 2 ты был совершенно прав! Плюс ещё φ = arccos(x/ρ). Но это и так понятно.


Автор: cardinal 9.11.2006, 00:54
По поводу задачи номер 4)

x2=ρ2*cos(φ2), 
y2=ρ2*sin(φ2),
x1=ρ1*cos(φ1), 
y1=ρ1*sin(φ1)

подставляем в формулу
s = sqrt( ( x2 - x1 )^2 + ( y2 - y1 )^2 ) 
, написанную zhenium

и получаем, что хотели...

Можно и по-другому, но писать лень... smile 

Автор: zhenium 9.11.2006, 02:48
Абсолютно согласен с Сardinal'ом!
С твоего позволения, Cardinal, я закончуsmile

s = sqrt( ( ρ2*cos(φ2) - ρ1*cos(φ1) )^2 + ( ρ2*sin(φ2) - ρ1*sin(φ1) )^2 ) 

Если есть ещё вопросы - поделились...

Автор: Гениальный123Робот 9.11.2006, 13:16
Мужики, спасибо! Пока буду разбираться... если что, подниму тему снова, скинув наисанный мною код..

Автор: maxim1000 9.11.2006, 13:37
или по формуле косинусов:
d(a,b)^2=r(a)^2 + r(b)^2 - 2*r(a)*r(b)*cos(angle(a)-angle(b))

Автор: Гениальный123Робот 14.11.2006, 18:36
Приветствую! Поглядите задачу, бо есть ошибки! Решена она оч-оч просто, бо не люблю мудрить! Кому не лень, скопируйте полностью и протестируйте. Там такая вот ошибка выдается при вычислении корня sqrt: Domain Error  и результат выдает = +NAN 
Что тут не так?
 

Код

#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>

void Menu(void);
void fun1(void);
void fun2(void);
void fun3(void);
void fun4(void);

 main()
{

 int choice;
 int quitting = 0;

  Menu();

  while (!quitting) {

choice=toupper(getch());

switch (choice) {

 case 'A' :
 fun1();
 Menu();
 break;

 case 'B' :
 fun2();
 Menu();
 break;

 case 'C' :
 fun3();
 Menu();
 break;

 case 'D' :
 fun4();
 Menu();
 break;

 case 'E':
 quitting=1;
 break;

  default:
  printf("\nSelection Error! Enter valid A, B, C or D value!\n");
  break;
   }

 }
  return 0;
}

 void Menu(void)
 {
  printf("\nEnter A - to enter polar coordinates and find decart coordinates\n");
  printf("Enter B - to enter decart coordinates and find polar coordinates\n");
  printf("Enter C - to find the distance between two dots in polar system of coordinates \n");
  printf("Enter D - to find the distance between two dots in decart system of coordinates\n");
  printf("Enter E - to quit\n");
 }


  void fun1(void)
 {
 
  double p, f;
  double x, y;

  printf("\nEnter vector-radious P: p= ");
   scanf("%lf", &p);
  printf("\nEnter angle f: f= ");
   scanf("%lf", &f);

  x=p*cos(f);
  y=p*sin(f);

  printf("\n x= %lf", x);
  printf("\n y= %lf\n", y);
 }

  void fun2(void)
 {
  
  double p, f;
  double x, y;

  printf("\nEnter Coordinate X: x= ");
   scanf("%lf", &x);
  printf("\nEnter Coordinate Y: y= ");
   scanf("%lf", &y);

  p=sqrt(x*x+y*y);
  f=atan(y/x);

  printf("\n p= %lf", p);
  printf("\n f= %lf\n", f);
 }



  void fun3(void)
 {
  
  int x1, y1;
  int x2, y2;
  double d;

  printf("\nEnter Coordinate X1: x1= ");
   scanf("%d", &x1);
  printf("\nEnter Coordinate Y1: y1= ");
   scanf("%d", &y1);
  printf("\nEnter Coordinate X2: x2= ");
   scanf("%d", &x2);
  printf("\nEnter Coordinate Y2: y2= ");
   scanf("%d", &y2);

  d=sqrt((x2-x1)*2+(y2-y1)*2);
      printf("\nThe distance is = %lf\n", d);

 }


  void fun4(void)
 {

  int P1, P2;
  int f1, f2;
  double d;

  printf("\nEnter Coordinate P1: P1= ");
   scanf("%d", &P1);
  printf("\nEnter Coordinate f1: f1= ");
   scanf("%d", &f1);
  printf("\nEnter Coordinate P2: P2= ");
   scanf("%d", &P2);
  printf("\nEnter Coordinate f2: f2= ");
   scanf("%d", &f2);

  d=sqrt((P2*cos(f2)-P1*cos(f1))*2 + (P2*sin(f2)-P1*sin(f1))*2);
    printf("\nThe distance is %lf", d);
  }

Автор: kali 14.11.2006, 18:43
Гениальный123Робот,]
Цитата

  d=sqrt((x2-x1)*2+(y2-y1)*2);

 тебе нужно не умножать на 2 а возводить во 2 степень
т.е.
d=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));

смотри свои fun3  и fun4

Автор: Гениальный123Робот 14.11.2006, 18:58
Цитата(kali @ 14.11.2006,  18:43)
Гениальный123Робот,]
Цитата

  d=sqrt((x2-x1)*2+(y2-y1)*2);

 тебе нужно не умножать на 2 а возводить во 2 степень
т.е.
d=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));

смотри свои fun3  и fun4

Ух, да! Устал под конец... Исправил в программе, спасибо. 

Еще будут рекомендации и пожелания?  ;)

Автор: smalcom 14.11.2006, 19:30
прими 50 грам за повышение бала

Автор: Гениальный123Робот 15.11.2006, 00:31
Цитата(smalcom @ 14.11.2006,  19:30)
прими 50 грам за повышение бала

Наливай  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)