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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Милашечка
0 / 0 / 0
Регистрация: 16.02.2013
Сообщений: 117
#1

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

03.03.2013, 21:43. Просмотров 480. Ответов 8
Метки нет (Все метки)

Заданы окружность(положением центра и радиусом), треугольник (координатами трех вершин), квадрат (координатами четырех вершин). Определить – можно ли расположить треугольник или четырехугольник внутри окружности.

для ввода координат - вывода окружности,треугольника, четырехугольника на экран программку сделала.. воть если надо
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;
}
а как проверить на возможность расположения внутри окружности - запуталась..


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

Немного не понимаю как правильно сделать наследование - C++
Вот например, есть структура Point(точка). Если надо сделать структуру Round(круг), то в этом случае надо наследовать Point потому что у...

Немного не понимаю std::move - C++
Здравствуйте, я немного не понимаю работу кода на 150-155 строках здесь: #include &lt;iostream&gt; #include &lt;memory&gt; #include...

Не понимаю как реализовать возврат на строку - C++
Вообще в чем моя проблема, как сделать так что бы при не верном пароле пользователя возвращало на строку ввода пароля char...

Немного исправить ошибки. Тема: стэки, списки, очереди. Не понимаю в чем дело - C++
// 15.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &quot;iostream&quot; #define reis struct...

Немного не понимаю задание - C#
Реализовать программу монитор, отслеживающую состояние заданного при запуске каталога и выполняющего над новыми файлами некие действия....

Немного не понимаю по теории sql - SQL Server
1. Какие конструкции языка Sql используются для задания правил поддержания целостности базы данных? 2. Что такое конструктор запросов в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6472 / 3120 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
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)
1
Милашечка
0 / 0 / 0
Регистрация: 16.02.2013
Сообщений: 117
04.03.2013, 13:21  [ТС] #3
то есть если я правильно поняла,необходимы просто условия для существования описанной окружности вокруг треугольника и четырехугольника. и сравнить эти условия с существующим(введенным для данной окружности). если они меньше или равны с данным радиусом - то треугольник и четырехугольник можно вписать в данную окружность. правильно??
и мне больше нравится формула нахождения радиуса описанной окружности для треугольника R=abc/4S,где
Цитата Сообщение от IGPIGP Посмотреть сообщение
S=Sqrt(p(p-a)(p-b)(p-c))
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6472 / 3120 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
04.03.2013, 13:53 #4
Цитата Сообщение от Милашечка Посмотреть сообщение
то есть если я правильно поняла,необходимы просто условия для существования описанной окружности вокруг треугольника и четырехугольника. и сравнить эти условия с существующим(введенным для данной окружности). если они меньше или равны с данным радиусом - то треугольник и четырехугольник можно вписать в данную окружность. правильно??
Цитата Сообщение от Милашечка Посмотреть сообщение
и мне больше нравится формула нахождения радиуса описанной окружности для треугольника R=abc/4S,где
Милашечка, математика, такая вещь, что применимость той или иной формулы это не дело вкуса. Но если треугольник прямоугольный, то действительно, R=abc/4S. И слово прямоугольный не малая к тому причина. Не нашёл я такого слова. Хм... Сейчас пересмотрел и для четырехугольника такого слова не видно. Ушёл думать. А Вы, не томите, ведь если они оба прямоугольные, то это приятная новость. Обрадуйте, как только сможете.
0
Милашечка
0 / 0 / 0
Регистрация: 16.02.2013
Сообщений: 117
04.03.2013, 15:17  [ТС] #5
Цитата Сообщение от IGPIGP Посмотреть сообщение
Обрадуйте, как только сможете.
незнаю как на счет обрадовать, но нарисовав на листе несколько разных четырехугольников , треугольников и окружностей возникла мысль что просто нужно длины сторон сравнивать с радиусом окружности.. ведь если хоть одна сторона больше радиуса - значит окружность не является описываемой вокруг например того же треугольника.. а если радиус больше - то описывает
вот и будет что
Цитата Сообщение от IGPIGP Посмотреть сообщение
расстояние от центра окружности для всех вершин меньше радиуса, то четырехугольник или треугольник лежит внутри окружности.Расстояние определяется по теореме Пифагора.
или бред рассуждаю??

Добавлено через 58 секунд
а расстояние по теореме пифагора и есть длины прямых, которые нужно посчитать
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6472 / 3120 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
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;
}
1
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
05.03.2013, 12:02 #7
я не понимаю о чем разглагольствовать, если тут тупые условия о которых написано выше,
Цитата Сообщение от Милашечка Посмотреть сообщение
дословно преподша сказала, что если расстояние от центра окружности для всех вершин меньше радиуса, то четырехугольник или треугольник лежит внутри окружности.Расстояние определяется по теореме Пифагора.
т.е проверить вершины внутри круга или нет? т.е сравнить расстояния от центра до вершины с радиусом, и вопрос о вписавыемости решен расстояние
C++
1
2
double d = sqrt((координата вершины х- координата центра х)*(координата вершины х- координата центра х)
+(координата вершины у- координата центра у)*(координата вершины у- координата центра у))
0
Милашечка
0 / 0 / 0
Регистрация: 16.02.2013
Сообщений: 117
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, все фигуры произвольные, так как вводя координаты для них вручную мы заранее не может угадать какой именно треугольник или четырехугольник мы получим.. а вопрос стоял именно о четырехугольниках..

спасибо за примертоже как вариант можно рассматривать в реализации данной задачки
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6472 / 3120 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
13.03.2013, 02:11 #9
Цитата Сообщение от Милашечка Посмотреть сообщение
IGPIGP, все фигуры произвольные, так как вводя координаты для них вручную мы заранее не может угадать какой именно треугольник или четырехугольник мы получим.. а вопрос стоял именно о четырехугольниках..
спасибо за примертоже как вариант можно рассматривать в реализации данной задачки
Не за что.
Что касается четырехугольника, то в тексте же сказано "квадрат" и это значит только квадрат и больше ничего кроме. Если Ваши преподаватели, признаны дееспособными.
Проверить же координаты на принадлежность квадрату и послать юзера учить справочник по квадратам, это несложно. Легче чем с произвольным четырехугольником возиться. Хотя имея модуль для произвольного треугольника, - тоже не сложно. Каждый выпуклый четырехугольник это пара непересекающихся треугольников. Нужно лишь проверить на выпуклость.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2013, 02:11
Привет! Вот еще темы с ответами:

Компьютер для программирования и немного графики - Рабочая станция
помогите подобрать комп в диапазоне до 25000 рублей для программирования(чтобы visual studio 2013 и embarcadero rad studio xe5 ,при...

не понимаю как реализовать одновременную работу процессов, как сделать так, что бы они одновременно проверяли доступен ресурс или нет - Visual Basic
Здравствуйте! Подскажите, как можно одновременно запустить проверку условия. Я пытаюсь написать программу решения проблемы обедающих...

Системный блок для 3d и 2d графики и немного видеомонтажа 70-80тыр - Рабочая станция
Добрый день. Помогаю знакомой - дизайнеру интерьеров - с покупкой новой графической станции. Планируемый к использованию софт: ...

Процессор amd 6600k black edition. Показатели графики немного не устраивают - Процессоры
Здравствуйте! Есть проблемы с amd 6600k на richland`е. Если поконкретнее их две: 1. Показатели графики немного не устраивают. Проп....


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.03.2013, 02:11
Ответ Создать тему
Опции темы

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