Форум программистов, компьютерный форум CyberForum.ru

немного графики+векторы. по смыслу понимаю, а как реализовать - запуталась - C++

Войти
Регистрация
Восстановить пароль
 
Милашечка
0 / 0 / 0
Регистрация: 16.02.2013
Сообщений: 98
03.03.2013, 21:43     немного графики+векторы. по смыслу понимаю, а как реализовать - запуталась #1
Заданы окружность(положением центра и радиусом), треугольник (координатами трех вершин), квадрат (координатами четырех вершин). Определить – можно ли расположить треугольник или четырехугольник внутри окружности.

для ввода координат - вывода окружности,треугольника, четырехугольника на экран программку сделала.. воть если надо
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <graphics.h> // vkljy4it' opisanie grafi4eskich fynkcij Г‘/Г‘++ Borland'a
#include<stdio.h>
#include <conio.h>      // opisanie fynkcii vvoda-vivoda s konsoli(dlja getch())
#include <math.h> 
 
int a,b,c;
int okr()
{printf("vvedite koordinati centra i radius okru*nosti: x=");
 scanf("%d%d%d",&a, &b, &c);  
 printf("\n");
 circle(a,b,c);
}
int vvod_4ygol()
{int a1,a2,b1,b2,c1,c2,d1,d2;
printf("vvedite koordinati vershin 4etirexygol'nika:\n");
printf("a=");
 scanf("%d%d",&a1, &a2);   printf("\n");
printf("b=");
 scanf("%d%d",&b1, &b2);   printf("\n"); 
 printf("c=");
 scanf("%d%d",&c1, &c2);   printf("\n");
 printf("d=");
 scanf("%d%d",&d1, &d2);   printf("\n");
moveto(a1,a2);
lineto(b1,b2);
lineto(c1,c2);
lineto(d1,d2);
lineto(a1,a2);
}
 
int treyg()
{int x1,x2,x3,y1,y2,y3;
 
printf("vvedite koordinati vershin treygol'nika:\n");
printf("x=");
 scanf("%d%d",&x1, &y1);   printf("\n");
printf("y=");
 scanf("%d%d",&x2, &y2);   printf("\n"); 
 printf("z=");
 scanf("%d%d",&x3, &y3);   printf("\n");
 
moveto(x1,y1);
lineto(x2,y2);
lineto(x3,y3);//risuet linii - storoni treygol'nika
lineto(x1,y1);
 
}
int main ()
{
  int gdriver = DETECT, gmode;
  initgraph(&gdriver, &gmode, "");      
  setbkcolor(2);                                      
  setcolor(5);
  okr();
  vvod_4ygol();
  treyg();
  getch();                 
  closegraph();        
  return 0;
}
а как проверить на возможность расположения внутри окружности - запуталась..


дословно преподша сказала, что если расстояние от центра окружности для всех вершин меньше радиуса, то четырехугольник или треугольник лежит внутри окружности.Расстояние определяется по теореме Пифагора.
понимаю что используется векторная алгебра..но..
что к чему приравнивать - не знаюне соображу
дайте подсказочку..или формулу..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2013, 21:43     немного графики+векторы. по смыслу понимаю, а как реализовать - запуталась
Посмотрите здесь:

не понимаю как прога работает C++
Как связаны собственные значения и векторы матриц А и А^5? C++
Найди серединку. Не понимаю как сделать и как начать C++
C++ Немного не понимаю как правильно сделать наследование
построить график выбранной функции.запуталась C++
C++ Не понимаю как сделать
совсем запуталась с построением( C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6235 / 2964 / 288
Регистрация: 04.12.2011
Сообщений: 7,915
Записей в блоге: 3
04.03.2013, 00:37     немного графики+векторы. по смыслу понимаю, а как реализовать - запуталась #2
Цитата Сообщение от Милашечка Посмотреть сообщение
дословно преподша сказала, что если расстояние от центра окружности для всех вершин меньше радиуса, то четырехугольник или треугольник лежит внутри окружности.Расстояние определяется по теореме Пифагора.
понимаю что используется векторная алгебра..но..
Можно и без векторной алгебры. Преподаватель сказала правильно и это значит, что координаты центра окружности Вам не нужны.
Радиус описанной вокруг прямоугольника - половина диагонали, по т. Пифагора R=Sqrt(a^2 + b^2)/2
Радиус описанной вокруг треугольника R=a/(2SinA) = b/(2SinB) = c/(2SinC), где пары вроде a B - сторона и противолежащий угол.
Угол можно отыскать вспомнив что площадь S=abSinC
С - угол между a и b
и
S=Sqrt(p(p-a)(p-b)(p-c))
то есть SinC=S/ab
где p - полупериметр треугольника
Длина любого отрезка с концами M1(x1,y1) и M2(x2,y2) равна по той же т. Пифагора:
|M1 M2| = Sqrt((x2 - x1)^2 + (y2 - y1)^2)
Милашечка
0 / 0 / 0
Регистрация: 16.02.2013
Сообщений: 98
04.03.2013, 13:21  [ТС]     немного графики+векторы. по смыслу понимаю, а как реализовать - запуталась #3
то есть если я правильно поняла,необходимы просто условия для существования описанной окружности вокруг треугольника и четырехугольника. и сравнить эти условия с существующим(введенным для данной окружности). если они меньше или равны с данным радиусом - то треугольник и четырехугольник можно вписать в данную окружность. правильно??
и мне больше нравится формула нахождения радиуса описанной окружности для треугольника R=abc/4S,где
Цитата Сообщение от IGPIGP Посмотреть сообщение
S=Sqrt(p(p-a)(p-b)(p-c))
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6235 / 2964 / 288
Регистрация: 04.12.2011
Сообщений: 7,915
Записей в блоге: 3
04.03.2013, 13:53     немного графики+векторы. по смыслу понимаю, а как реализовать - запуталась #4
Цитата Сообщение от Милашечка Посмотреть сообщение
то есть если я правильно поняла,необходимы просто условия для существования описанной окружности вокруг треугольника и четырехугольника. и сравнить эти условия с существующим(введенным для данной окружности). если они меньше или равны с данным радиусом - то треугольник и четырехугольник можно вписать в данную окружность. правильно??
Цитата Сообщение от Милашечка Посмотреть сообщение
и мне больше нравится формула нахождения радиуса описанной окружности для треугольника R=abc/4S,где
Милашечка, математика, такая вещь, что применимость той или иной формулы это не дело вкуса. Но если треугольник прямоугольный, то действительно, R=abc/4S. И слово прямоугольный не малая к тому причина. Не нашёл я такого слова. Хм... Сейчас пересмотрел и для четырехугольника такого слова не видно. Ушёл думать. А Вы, не томите, ведь если они оба прямоугольные, то это приятная новость. Обрадуйте, как только сможете.
Милашечка
0 / 0 / 0
Регистрация: 16.02.2013
Сообщений: 98
04.03.2013, 15:17  [ТС]     немного графики+векторы. по смыслу понимаю, а как реализовать - запуталась #5
Цитата Сообщение от IGPIGP Посмотреть сообщение
Обрадуйте, как только сможете.
незнаю как на счет обрадовать, но нарисовав на листе несколько разных четырехугольников , треугольников и окружностей возникла мысль что просто нужно длины сторон сравнивать с радиусом окружности.. ведь если хоть одна сторона больше радиуса - значит окружность не является описываемой вокруг например того же треугольника.. а если радиус больше - то описывает
вот и будет что
Цитата Сообщение от IGPIGP Посмотреть сообщение
расстояние от центра окружности для всех вершин меньше радиуса, то четырехугольник или треугольник лежит внутри окружности.Расстояние определяется по теореме Пифагора.
или бред рассуждаю??

Добавлено через 58 секунд
а расстояние по теореме пифагора и есть длины прямых, которые нужно посчитать
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6235 / 2964 / 288
Регистрация: 04.12.2011
Сообщений: 7,915
Записей в блоге: 3
05.03.2013, 04:09     немного графики+векторы. по смыслу понимаю, а как реализовать - запуталась #6
Милашечка, если речь не о прямоугольниках, а произвольных четырехугольниках, то задача достаточно муторная. Не сложная а нудная. Если у кого-то есть готовое решение... или пара часов. Поэтому вопрос остаётся открытым: - прямоугольники или нет?
Если нет, то решение может быть таким. Решаем для точки, отрезка, треугольника. Вырожденные случаи просты, но они понадобятся для предотвращения неприятностей в дальнейшем.
Для четырехугольника, у которого все вершины совпадают весь алгоритм состоит, например, в выводе сообщения вроде "прямоугольник - точка, может быть размещен в любой окружности".
Для отрезка легко справитесь сами.
Для треугольника (произвольного опять же), - находим точку пересечения двух серединных перпендикуляров (записываем и решаем систему 2-х линейных уравнений). Радиус - расстояние от центра до любой вершины.
Для четырехугольника есть четыре способа исключая вершину получить треугольник. Решаем задачу для каждого (см. выше) и проверяем попала ли оставшаяся точка в полученную окружность. По крайней мере в одном случае попадёт обязательно. Эта окружность и есть искомая. Все что крупнее подойдёт. И при разборе обязательно проверять на вырожденность фигур (функции обработки этих случаев же уже готовы). Что бы не попытаться решить линейно-зависимую систему, например.

Добавлено через 8 часов 58 минут
Милашечка, нашёл магическое слово в условии и это слово - квадрат! Странно, что я его не заметил. И оно единожды встречается в тексте, а далее только четырехугольник. Но если квадрат то считаем сторону, делим на корень из 2-х и сравниваем с радиусом. Всё, что написано про четырехугольники - зря.
Теперь, если окажется, что и треугольник прямоугольный, то вообще красота. Посмотрите своё задание и скажите.

Добавлено через 3 часа 30 минут
Милашечка, раз Вы не хотите признаваться прямоугольный ли или произвольный треугольник, надеюсь у Вас есть веские причины это скрывать. Вот вариант для произвольного треугольника. Графику я заремил так как не имею такой библиотеки. Я постарался не не трогать то что смог не потрогать, чтобы Вам было проще использовать имеющийся код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
//#include <graphics.h> // я на MVS и нет уменя этой библиотеки С/С++ Borland'a
#include<stdio.h>
#include <conio.h>      // opisanie fynkcii vvoda-vivoda s konsoli(dlja getch())
#include <math.h> 
void okr(int& a, int& b, int& c)
{printf("vvedite koordinati centra i radius okru*nosti: Xc, Yc, Rokr\n");
 scanf("%d %d %d", &a, &b, &c);  
 printf("\n");
 //circle(a,b,c);
}
void vvod_4ygol(int& a1, int& a2, int& b1, int& b2, int& c1, int& c2, int& d1, int& d2)
{
printf("vvedite koordinati vershin 4etirexygol'nika:\n");
printf("X1, Y1\t");
 scanf("%d%d",&a1, &a2);   printf("\n");
printf("X2, Y2\t");
 scanf("%d%d",&b1, &b2);   printf("\n"); 
 printf("X3, Y3\t");
 scanf("%d%d",&c1, &c2);   printf("\n");
 printf("X4, Y4\t");
 scanf("%d%d",&d1, &d2);   printf("\n");
/*
moveto(a1,a2);
lineto(b1,b2);
lineto(c1,c2);
lineto(d1,d2);
lineto(a1,a2);
*/
}
void treyg(int& x1,int& x2,int& x3,int& y1,int& y2,int& y3)
{
printf("vvedite koordinati vershin treygol'nika:\n");
printf("x1, y1\t");
 scanf("%d%d",&x1, &y1);   printf("\n");
printf("x2, y2\t");
 scanf("%d%d",&x2, &y2);   printf("\n"); 
 printf("x3, y3\t");
 scanf("%d%d",&x3, &y3);   printf("\n");
/* 
moveto(x1,y1);
lineto(x2,y2);
lineto(x3,y3);//risuet linii - storoni treygol'nika
lineto(x1,y1);
*/ 
}
double distansOfCoord(double X1, double Y1, double X2, double Y2){
return sqrt((X1-X2)*(X1-X2) + (Y1-Y2)*(Y1-Y2));
}
double RadiusOpisannoy(double X41, double Y41, double X42, double Y42){//kvadrat
double R=0;
if(X41!=X42||Y41!=Y42){
R=distansOfCoord(X41,  Y41,  X42,  Y42)/sqrt(2.0);
}else{
printf("2-e vershini quadrata sovpadaut. Program aborting, HDD formating, nicht chisen!\n");
getch();
R=-1.0;
}
return R;
}
double RadiusOpisannoy(double X31, double Y31, double X32, double Y32 , double X33, double Y33){//treug
double R=0;
double a=0;
double b=0;
double c=0;
double p=0;
int well=1;
int alliswell=0;
if(X31!=X32||Y31!=Y32){
a=distansOfCoord(X31,  Y31,  X32,  Y32);
if(X32!=X33||Y32!=Y33){
b=distansOfCoord(X32,  Y32,  X33,  Y33);
if(X33!=X31||Y33!=Y31){
c=distansOfCoord(X33,  Y33,  X31,  Y31);
}else well=0;
}else well=0;
}else well=0;
if(well){
p=(a+b+c)/2.0;
R=a*b*c/(4.0 * sqrt(  p*(p-a)*(p-b)*(p-c) ) );
}else{
printf("2-e vershini treugolnika sovpadaut. Program aborting, HDD formating, nicht chisen!\n");
getch();
    R=-1.0;
}
return R;
}
int main ()
{
 // int gdriver = DETECT, gmode;
  //initgraph(&gdriver, &gmode, "");      
  //setbkcolor(2);                                      
  //setcolor(5);
int  Xc,  Yc,  R;
 okr(Xc,  Yc,  R);
 double Rokr=(double) R;
int X41, X42, X43, X44;
int Y41, Y42, Y43, Y44;
vvod_4ygol(X41, Y41, X42, Y42, X43, Y43, X44, Y44);
double Rqud=RadiusOpisannoy(X41, Y41, X42, Y42);
if(Rqud>0){
    if(Rqud<=Rokr){
printf("qudrat pomestilsya! \n");
    }else{
printf("qudrat ne pomestilsya! \n");
    }
printf("Rqud=\t");
printf("%f", Rqud);
printf("\n");
int X31, X32, X33;
int Y31, Y32, Y33;
treyg(X31, X32, X33, Y31, Y32, Y33);
double Xtr1=(double) X31;
double Xtr2=(double) X32;
double Xtr3=(double) X33;
double Ytr1=(double) Y31;
double Ytr2=(double) Y32;
double Ytr3=(double) Y33;
double Rtr=RadiusOpisannoy(Xtr1, Ytr1, Xtr2, Ytr2, Xtr3, Ytr3);
printf("Rtr=\t");
printf("%f", Rtr);
printf("\n");
if(Rtr>0){
if(Rtr<=Rokr){
printf("treugolnic pomestilsya! \n");
    }else{
printf("treugolnic ne pomestilsya! \n");
    }
}
}
  getch();                 
  //closegraph();        
  return 0;
}
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
05.03.2013, 12:02     немного графики+векторы. по смыслу понимаю, а как реализовать - запуталась #7
я не понимаю о чем разглагольствовать, если тут тупые условия о которых написано выше,
Цитата Сообщение от Милашечка Посмотреть сообщение
дословно преподша сказала, что если расстояние от центра окружности для всех вершин меньше радиуса, то четырехугольник или треугольник лежит внутри окружности.Расстояние определяется по теореме Пифагора.
т.е проверить вершины внутри круга или нет? т.е сравнить расстояния от центра до вершины с радиусом, и вопрос о вписавыемости решен расстояние
C++
1
2
double d = sqrt((координата вершины х- координата центра х)*(координата вершины х- координата центра х)
+(координата вершины у- координата центра у)*(координата вершины у- координата центра у))
Милашечка
0 / 0 / 0
Регистрация: 16.02.2013
Сообщений: 98
13.03.2013, 02:02  [ТС]     немного графики+векторы. по смыслу понимаю, а как реализовать - запуталась #8
aLarman, вы правы . должно быть чтото вроде этого (только для треугольников рассматривала для начала):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <graphics.h> // vkljy4it' opisanie grafi4eskich fynkcij Г‘/Г‘++ Borland'a
#include<stdio.h>
#include <conio.h>      // opisanie fynkcii vvoda-vivoda s konsoli(dlja getch())
#include <math.h> 
 
 
int okr(int *a,int *b,int *c)
{
printf("vvedite koordinati centra i radius okru*nosti: ");
scanf("%d%d%d",&*a, &*b,&*c); printf("\n");  
 
 circle(*a,*b,*c);
}
 
 
int treyg(int *x1,int *y1,int *x2,int *y2,int *x3,int *y3)
{ 
 
printf("vvedite koordinati vershin treygol'nika:\n");
printf("x=");
 scanf("%d%d",&*x1, &*y1);   printf("\n");
printf("y=");
 scanf("%d%d",&*x2, &*y2);   printf("\n"); 
 printf("z=");
 scanf("%d%d",&*x3, &*y3);   printf("\n");
 
moveto(*x1,*y1);
lineto(*x2,*y2);
lineto(*x3,*y3);//risuet linii - storoni treygol'nika
lineto(*x1,*y1);
 
}
 
 
 
int usl_treyg()
{ 
float x1y1,x2y2,x3y3;
treyg(&xx1,&yy1,&xx2,&yy2,&xx3,&yy3);
 
 okr(&x0,&y0,&r);
 double rokr=(double) r;
 
 
x1y1=sqrt(pow(xx1-x0,2)+pow(yy1-y0,2));
x2y2=sqrt(pow(xx2-x0,2)+pow(yy2-y0,2));//dlja ka*doj vershini s4itaem rasstojanie ot centra okru*nosti
x3y3=sqrt(pow(xx3-x0,2)+pow(yy3-y0,2));
 
if (x1y1< rokr)&(x2y2<rokr)&(x3y3<rokr); // i sravnivaem s radiusom
   printf ("treygol'nik vpisuvaetsa v okru*nost'");
   else if printf("treygol'nik ne vpisuvaetsa v okru*nost'");
    
   
   } 
 
 
 
 
int main ()
{
  int gdriver = DETECT, gmode;
  initgraph(&gdriver, &gmode, "");      
  setbkcolor(2);                                      
  setcolor(5);
  okr();
  treyg();
  
  
  usl_treyg();
  
  
  
  
  getch();                 
  closegraph();        
  return 0;
}
конечно там еще много ошибок.. с функциями только учусь работать.. но смысл такой.. и для прямоугольников также..

Добавлено через 2 минуты
IGPIGP, все фигуры произвольные, так как вводя координаты для них вручную мы заранее не может угадать какой именно треугольник или четырехугольник мы получим.. а вопрос стоял именно о четырехугольниках..

спасибо за примертоже как вариант можно рассматривать в реализации данной задачки
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2013, 02:11     немного графики+векторы. по смыслу понимаю, а как реализовать - запуталась
Еще ссылки по теме:

Не понимаю как работает рекурсия C++
C++ Реализовать пользовательский класс "Связанный список" (не понимаю код)
C++ Немного исправить ошибки. Тема: стэки, списки, очереди. Не понимаю в чем дело
Не понимаю как сделать! C++
Не понимаю как записать формулу C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6235 / 2964 / 288
Регистрация: 04.12.2011
Сообщений: 7,915
Записей в блоге: 3
13.03.2013, 02:11     немного графики+векторы. по смыслу понимаю, а как реализовать - запуталась #9
Цитата Сообщение от Милашечка Посмотреть сообщение
IGPIGP, все фигуры произвольные, так как вводя координаты для них вручную мы заранее не может угадать какой именно треугольник или четырехугольник мы получим.. а вопрос стоял именно о четырехугольниках..
спасибо за примертоже как вариант можно рассматривать в реализации данной задачки
Не за что.
Что касается четырехугольника, то в тексте же сказано "квадрат" и это значит только квадрат и больше ничего кроме. Если Ваши преподаватели, признаны дееспособными.
Проверить же координаты на принадлежность квадрату и послать юзера учить справочник по квадратам, это несложно. Легче чем с произвольным четырехугольником возиться. Хотя имея модуль для произвольного треугольника, - тоже не сложно. Каждый выпуклый четырехугольник это пара непересекающихся треугольников. Нужно лишь проверить на выпуклость.
Yandex
Объявления
13.03.2013, 02:11     немного графики+векторы. по смыслу понимаю, а как реализовать - запуталась
Ответ Создать тему
Опции темы

Текущее время: 02:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru