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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2009, 23:20   #1
Kript
Новичок
Джуниор
 
Регистрация: 06.06.2009
Сообщений: 2
По умолчанию программа , круг элипс прямая на С++

Вообщем ткоее дело есть задача , сам единственное что вышло это разобратся с кругом , а как с элипсом и прямой незнаю , если конкретно то как найти у элипса центр, помогите разобратся, язык конечно С++

Разработать программу, которая в ответ на вводимую с клавиатуры пару вещественных чисел, представляющих собой координаты X,Y точки A на плоскости, выдает текстовое сообщение о принадлежности этой точки заданной области. Например:"Точка принадлежит заданной области" или "Точка не принадлежит заданной области". В программе должно быть предусмотрено повторение всех операций с использованием оператора goto по нажатию заданной клавиши.

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>

main ()
{
clrscr();
int x,x0,y,y0,r,a,b,c,y1,x2;
cin>>x;
cin>>y;
x2=24;
r=5;
y1=-20;
x=x2;
y=0;
a=1;
b=-2*x;
c=x*x+(y-y0)*(y-y0)-r*r;
y0=y1+r;
x0=(-b+sqrt(b*b-4*a*c))/(2*a);
if ((x>0 && y>0 && ((x-x0)*(x-x0)+(y-y0)*(y-y0)<r*r))
| (x<=0 && y<=0 && ((x-x0)*(x-x0)+(y-y0)*(y-y0)<r*r)))
cout<<"YES!!!";
else cout<<"NO!!!";
getch();
return 0;
}
Изображения
Тип файла: jpg 32.jpg (10.2 Кб, 82 просмотров)

Последний раз редактировалось Kript; 06.06.2009 в 23:23.
Kript вне форума Ответить с цитированием
Старый 07.06.2009, 19:03   #2
Kript
Новичок
Джуниор
 
Регистрация: 06.06.2009
Сообщений: 2
По умолчанию

После долгих мучений вот что вышло , поправте если что не так


#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#define r 23
#define AA 19
#define BB 35

main ()
{
clrscr();
int x,x1,x2,x0okr,x0el;
int y,y1,y2,y0okr,y0el,a,b,c;

x1=-22;
x2=25;
y2=-37;
y1=-20;

x=x1;
y=0;

a=1; //Vyvod centra okrygnosti
b=-2*x;
y0okr=y1+r;
c=x*x+(y-y0okr)*(y-y0okr)-r*r;
x0okr=(-b+sqrt(b*b-4*a*c))/(2*a);

x=x2;
y=0;

a=1; //Vyvod centra elipsa
b=-2*x;
y0el=y2+r;
c=x*x+(y-y0el)*(y-y0el)-AA*BB;
x0el=(-b+sqrt(b*b-4*a*c))/(2*a);

cin>>x; //vvod X i Y
cin>>y;

if ((x>0 && y>0 && ((x-x0okr)*(x-x0okr)+(y-y0okr)*(y-y0okr)<r*r))
| (x<=0 && y>=0 && ((x-x0okr)*(x-x0okr)+(y-y0okr)*(y-y0okr)<r*r)))

if (((x>0) && (y<0) && ((x-x0el)*(x-x0el))/(AA*AA)+((y-y0el)*(y-y0el))/BB<1)
| ((x>0)&&((x-x0el)*(x-x0el))/(AA*AA)+((y-y0el)*(y-y0el))/BB>1))

cout<<"YES!!!";
else cout<<"NO!!!";
getch();
return 0;
}

и еще не получается с прямой , подскажите как быть
Kript вне форума Ответить с цитированием
Старый 06.10.2022, 14:10   #3
voinoff123
Новичок
Джуниор
 
Регистрация: 06.10.2022
Сообщений: 3
По умолчанию ну вдруг кому надо

Код:
//
//  main.cpp
//  info2
//
//  Created by Дмитрий Вискунов on 06.10.2022.
//

#include <cstdlib>
#include <stdio.h>
#include <iostream>
#include <math.h>
#define r 32 // Радиус круга
// Коэфы элипса
#define AA 21 // Коэф a
#define BB 35 // Коэф b

using namespace std;



int main()
{
    int x,x1,x2,x0okr,x0el;
    int y,y1,y2,y0okr,y0el,a,b,c;
    x1 = -23;
    x2 = 47;
    y2 = -35;
    y1 = -35;
    x = x1;
    y = 0;
    
    int i = 0;
    
    a = 1; // центр окружности
    b=-2*x;
    y0okr=y1+r;
    c=x*x+(y-y0okr)*(y-y0okr)-r*r;
    x0okr=(-b+sqrt(b*b-4*a*c))/(2*a);
  //  cout << x0okr << endl;
    //cout << y0okr << endl;
    x=x2;
    y=0;
    
    a=1; // центр элипса
    b=-2*x;
    y0el=y2+r;
    c=x*x+(y-y0el)*(y-y0el)-AA*BB;
    x0el=(-b+sqrt(b*b-4*a*c))/(2*a);
//    cout << x0el << endl;
//    cout << y0el << endl;
    cout << "Введите X :" << endl;
    cin >> x;
    cout << "Введите Y :" << endl;
    cin >> y;
    
    

        
    if ((((x<0 and y<0 ) and (not(((x-x0el)*(x-x0el))/(AA*AA)+((y-y0el)*(y-y0el))/(BB*BB)<1))) and ((x-x0okr)*(x-x0okr)+(y-y0okr)*(y-y0okr)<r*r)) and (((12/17)*x+(105/21,5))<=y)) {
        cout << "Точка принадлежит закаршенным областям" << endl;
        i = 0;
        exit(0);
    }
    
    if (((x>0 && y>0 && ((x-x0okr)*(x-x0okr)+(y-y0okr)*(y-y0okr)<=r*r)) or (x<=0 && y<=0 && ((x-x0okr)*(x-x0okr)+(y-y0okr)*(y-y0okr)<=r*r))) and (((12/17)*x+(105/21,5))>=y))
    {
        i++;
        //cout << i << "1"<< endl;
        
    }
    if ((((x>0) && (y>0) && ((x-x0el)*(x-x0el))/(AA*AA)+((y-y0el)*(y-y0el))/(BB*BB)<1) or (not((x<0) && (y<0)&&((x-x0el)*(x-x0el))/(AA*AA)+((y-y0el)*(y-y0el))/(BB*BB)<1)))and ((12/17)*x+(105/21,5))>=y){
        i++;
        //cout << i << endl;
    }
    
    if (i >= 2){
        cout << "Точка принадлежит закрашенным областям" << endl;
        i = 0;
    }else{
        cout << "Точка не принадлежит закрашенным областям" << endl;
        i = 0;
    }
    
        
}
voinoff123 вне форума Ответить с цитированием
Старый 06.10.2022, 14:45   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

13 лет уже ни кому не надо.
macomics вне форума Ответить с цитированием
Старый 06.10.2022, 21:21   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

"Новое - это хорошо отлежавшееся старое" ©
digitalis вне форума Ответить с цитированием
Старый 07.10.2022, 23:49   #6
voinoff123
Новичок
Джуниор
 
Регистрация: 06.10.2022
Сообщений: 3
По умолчанию

До меня все еще не доходит как составить уравнение прямой по двум точкам 0-0, из-за этого уравнение прямой написано от руки, если есть умные люди здесь , прошу помочь.
Код:
//
//  main.cpp
//  info_repeat
//
//  Created by Дмитрий Вискунов on 07.10.2022.
//

#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <math.h>
#define r 32 // Радиус круга
// Коэфы элипса
#define AA 21 // Коэф a
#define BB 35 // Коэф b

using namespace std;
string ans;

int main() {
    goto MATH;

MATH:
    int x,x1,x2,x0okr,x0el;
    int y,y1,y2,y0okr,y0el,a,b,c;
    int t1,t2 = 0;
    x1 = -23;
    x2 = 35;
    y2 = -35;
    y1 = 29;
    x = x1;
    y = 0;
    
    a = 1; // вычисляем центр окружности
    b=-2*x;
    y0okr=y1-r;
    c=x*x+(y-y0okr)*(y-y0okr)-r*r;
    x0okr=(-b+sqrt(b*b-4*a*c))/(2*a);
    cout << x0okr << endl;
    cout << y0okr << endl;
    
    x=x2;
    y=0;
    
    a=1; //вычисляем центр элипса
    b=-2*x;
    y0el=0;
    c=x*x+(y-y0el)*(y-y0el)-AA*BB;
    x0el=x - AA;
    
//        for (x = 0;x>-10;x--){
  //          if ((((((x-x0el)*(x-x0el))/(AA*AA)+((y-y0el)*(y-y0el))/(BB*BB)<1))) == 0){
    //            t1 = x;
      //          cout <<"T1 = "<< t1 << endl;
        //        x = 0;
          //      break;
            //}
        //}
    //for (x = 0;x<100;x++){
      //  if (((((x-x0el)*(x-x0el))/(AA*AA)+((y-y0el)*(y-y0el))/(BB*BB))) == ((x-x0okr)*(x-x0okr)+(y-y0okr)*(y-y0okr))){
        //    t2 = x;
          //  cout << "T2 = " << t2 << endl;
            //x = 0;
            //break;
       // }
    //}
    
    cout << x0el << endl;
    cout << y0el << endl;
    cout << "Введите X :" << endl;
    cin >> x;
    cout << "Введите Y :" << endl;
    cin >> y;
    
    
    
    
    
    if ((((x<0 and y<0 ) and (not(((x-x0el)*(x-x0el))/(AA*AA)+((y-y0el)*(y-y0el))/(BB*BB)<1))) and ((x-x0okr)*(x-x0okr)+(y-y0okr)*(y-y0okr)<r*r)) and ((0,7)*x+(4,8))<=y) {
        cout << "Точка принадлежит закаршенным областям" << endl;
        cout << "Повторить операцию? Да/Нет" << endl;
        cin >> ans;
        
    }
    
    if (((x>0 and y>0 and (((x-x0okr)*(x-x0okr)+(y-y0okr)*(y-y0okr))<=r*r)) and ((((x-x0el)*(x-x0el))/(AA*AA)+((y-y0el)*(y-y0el))/(BB*BB)<=1))) and (((0,7)*x+(4,8))>=y))
    {
        cout << "Точка принадлежит закрашенным областям" << endl;
        cout << "Повторить операцию? Да/Нет" << endl;
        cin >> ans;
        
        
    }else{
        cout << "Точка не принадлежит закрашенным областям" << endl;
        cout << "Повторить операцию? Да/Нет" << endl;
        cin >> ans;
        
    }
    
    

}
voinoff123 вне форума Ответить с цитированием
Старый 08.10.2022, 00:17   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Есть уравнение прямой на плоскости в общем виде: A*X + B*Y + C = 0; или так: k*X+b=y (переносим B*Y в правую часть и делим все уравнение на -B)
Подставляем в него координаты обоих точек и решаем систему из двух уравнений с двумя неизвестными (k и b): k*x0 + b = y0 и k*x1 + b = y1; получаем k = (y1 - y0) / (x1 - x0) и b = y0 - (y1 - y0) * x0 / (x1 - x0)
из чего получаем следующий код
Код:
double fline_by2pnt(double x, double x0, double y0, double x1, double y1) {
  if (x1 - x0 != 0) { return y0 + (y1 - y0)*(x - x0) / (x1 - x0); } else { return y0; }
}
Функция вычисляет значения f(x) = y для прямой заданной двумя её точками.

Последний раз редактировалось macomics; 08.10.2022 в 00:19.
macomics вне форума Ответить с цитированием
Старый 17.10.2022, 18:56   #8
voinoff123
Новичок
Джуниор
 
Регистрация: 06.10.2022
Сообщений: 3
По умолчанию

Дополнил и оптимизровал код - https://github.com/voinov-arduino/lab3
voinoff123 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
в текстовом документе нарисовать элипс состоящий из звездочек *, по заданному радиусу. autopsist Помощь студентам 6 22.12.2008 13:07
Элипс xakkkkker Общие вопросы Delphi 1 02.11.2008 06:07
Прямая линия serres Общие вопросы Delphi 1 04.11.2007 18:33
Прямая в пространстве Neuros1s Общие вопросы Delphi 12 29.06.2007 00:06