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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 01.08.2010, 21:42   #11
FelixXXI
Пользователь
 
Регистрация: 29.03.2010
Сообщений: 48
По умолчанию

Цитата:
В самом деле?..
А что смущает? И к чему последний код?

Дано:на плоскости 5 точек и окружность.
Найти:из задания непонятно, найти точки лежащие на окружности, либо найти точки лежащие внутри неё.

Идея решения: сравнить расстояние от каждой из 5 точек до центра окружности с радиусом окружности.
Если расстояние больше, понятно, что точка за пределами окружности,
если расстояние меньше, значит точка внутри окружности,
а если расстояние равно радиусу, значит точка лежит на окружности.

Расстояние между точками A(xA,yA) и B(xB,yB) вычисляется по формуле:
АВ=sqrt( (pow(xA-xB,2.) + pow(yA-yB,2.))
Fort-_-minor, решил эту формулу возвести в квадрат. А значит и сравнивать её надо с радиусом окружности в квадрате:
Что он и сделал
Код:
 if((pow(Points[i][0]-x0,2)+(pow(Points[i][1]-y0,2))==(pow(Rad,2))))
Согласно этой части кода, Fort-_-minor ищет точки лежащие на окружности.
-----------------------------------------------------------

Код:
#include <iostream>
#include <conio.h>
#include <math.h>

main (void) {
   
   const double PI = 4. * atan( 1. ) ;

   double   alpha = PI/4. ,
                R = 1.667 ,
                x0 = 0.f ,
                x = x0 + R * cos( alpha ) ,
                y0 = 0.f ,
                y = y0 + R * sin( alpha ) ;

   std::cout<<"Point with coords "<< x <<" and "<< y <<" is " ;
   if( (pow(x-x0,2.) + pow(y-y0,2.)) == pow(R,2.) ) 
      std::cout << "in circle\n" ;
   else
      std::cout << "not in circle\n" ;
   
   getch() ;
   
}
Это какая-то другая задача, в которой, зная центр окружности(0,0)и её радиус(1.667), ищут координату точки, лежащей на этой окружности под углом alpha = PI/4 (т.е. 45 градусов), а потом зачем-то проверяют, а на окружности ли лежит эта точка

Последний раз редактировалось FelixXXI; 01.08.2010 в 21:48.
FelixXXI вне форума
Старый 01.08.2010, 22:35   #12
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Это не "другая задача". Это - тестирование. Есть такой этап в создании ПО... Я всего лишь тестирую программу для проверки принадлежности точки окружности, предложенную одним и одобренную другим участником обсуждения (ну, или если уж быть совсем точным, вот этот
Код:
if((pow(Points[i][0]-x0,2)+(pow(Points[i][1]-y0,2))==(pow(Rad,2)))) {
фрагмент её). Беру конкретную точку, заведомо принадлежащую конкретной окружности, и... вышеупомянутая программа (или уж пусть будет "фрагмент") выдаёт мне (M$VC 6) "not in circle"! В чём дело?!

Последний раз редактировалось Vago; 01.08.2010 в 22:42.
Vago вне форума
Старый 02.08.2010, 01:35   #13
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
В чём дело?!
Не понятно ваше удивление. Как будто вы до этого с FPU никогда не работали. Хотите тестированием заняться. Ну напишите в вашей программе вот так, например:

Код:
printf("a-b=%3.16f R=%3.16f\n", (pow(x-x0,2.) + pow(y-y0,2.)), (pow(R,2.)));
и посмотрите, при каких R "not in circle" и почему.
Вообще для FPU сравнивать числа вот так в лоб, строго равно, как бы не совсем корректно, тем более если вы их получили в результате тригонометрических функций (читай команд). У меня, кстати, ваш пример показал "in circle". В чём дело?!

И ещё, для справки:
Есть такое понятие - точность вычисления. В сопроцессоре есть специальный регистр CWR значение 8 и 9 бита в этом регистре определяют длину мантиссы. (это так, к слову пришлось).
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума
Старый 02.08.2010, 10:07   #14
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Ulex, я, безусловно, немного знаю тонкости FP-вычислений, и именно поэтому пытался подтолкнуть к необходимости обратить своё внимание на эту сторону алгоритма двух других участников обсуждения Но, как ТС не понял Вашего деликатного вопроса "А почему == ?" и начал читать лекцию про разницу между "=" и "=="в ответ, так и Вы сейчас слишком серьёзно восприняли моё "В чём дело?!" "Тьфу ты" я говорить в ответ не буду, а просто попрошу у Вас прощения, за то что заставил написать Вас "многа букаф". Остаётся надеяться, что на Вашу фразу "Вообще для FPU сравнивать числа вот так в лоб, строго равно, как бы не совсем корректно" обратят внимание (хотя бы со временем) и г.г. fort-_-minor и FelixXXI

Точный результат у Вас обусловлен, скорее всего, другим компилятором. BTW, заменив pow() на умножение (откуда, кстати, такая любовь у народа к использованию pow() для возведения в квадрат или в куб?!), для данного набора исходных данных я получаю точный результат и у себя. Но это, как Вы понимаете, не даёт никаких гарантий, от возникновения ошибки округления на каком-то другом наборе входных данных.

Удачи!
Vago вне форума
Старый 02.08.2010, 12:36   #15
fort-_-minor
46KSS
Пользователь
 
Аватар для fort-_-minor
 
Регистрация: 26.07.2010
Сообщений: 58
По умолчанию

Вы правы , Ulex , спасибо. Там на самом деле должно быть вот так
Код:
#include <stdafx.h>
#include <iostream>
#include <cmath>
 
int main()
{
        const int X=5;
        const int Y=2;
        double Points[X][Y];
        double Rad=0, x0=0, y0=0;
        std::cout<<"Enter radius of circle: ";
        std::cin>>Rad;
        std::cout<<"Enter koord of center: ";
        std::cout<<"Enter x0: ";
        std::cin>>x0;
        std::cout<<"Enter y0: ";
        std::cin>>y0;
        for(int i=0;i<X;++i)
        {
                std::cout<<"Enter x and y for "<< i+1 <<" point:\n";
                for(int j=0;j<Y;++j)
                {
                        std::cout<<"Enter "<< j+1 <<"coord for "<< i+1 <<" point: ";
                        std::cin>>Points[i][j];
                }
        }
        for(int i=0;i<X;++i)
        {
                if((pow(Points[i][0]-x0,2)+(pow(Points[i][1]-y0,2))<=(pow(Rad,2))))
                {
                        std::cout<<"Point with coords "<< Points[i][0] <<" and "<< Points[i][1] <<" is in circle\n";
                }
                else
                        std::cout<<"Point with coords "<< Points[i][0] <<" and "<< Points[i][1] <<" is not in circle\n";
        }
        return 0;
}
На счет точек на окружности: их необходимо искать внутри оркужности, как справедливо заметил Ulex. На счет тестирования ПО ничего не скажу мне до этого далеко Спасибо за замечания, интересно слушать мнения разбирающихся людей
fort-_-minor вне форума
Закрытая тема


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Множества и Окружность Voortex Фриланс 10 05.03.2010 21:16
Есть ли какие-либо API шпионы? И где можно достать =) TwiX Софт 5 15.10.2009 11:42
Можно ли использовать новую форму только дря хранения какого-либо(каких-либо) класса? TwiX Общие вопросы Delphi 8 03.10.2009 11:06
Задача на Vba либо C++ либо Паскале Fraerrrrr Помощь студентам 3 27.05.2009 15:30
Окружность.. surovii Помощь студентам 28 29.03.2009 18:00