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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2010, 03:34   #11
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Всё верно. Рабоает.
А чтобы треугольники меняли размеры используй TrackBar.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 06.07.2010 в 03:42.
Smitt&Wesson вне форума Ответить с цитированием
Старый 06.07.2010, 11:10   #12
Snejnaya
Форумчанин
 
Регистрация: 12.05.2010
Сообщений: 219
По умолчанию

Цитата:
ВОПРОС. как мне найти координаты вершин треугольника когда я знаю радиус и координаты центра?
формулами школьной геометрии вычислить сторону треугольника и его высоту. "Верхняя" вершина равностороннего треугольника на 2/3 высоты выше, чем центр треугольника (т.е. центр описанной около него окружности). А "нижние" вершины треугольника на 1/3 высоты ниже центра и на 1/2 стороны треугольника правее (и, соотвественно, левее) центра.
А вообще можно масштабировать координаты вершин относительно центра треугольника.

Вот так можно...

r- радиус
х0,у0-координаты центра

координаты "правой" вершины
x1=x0+r*cos(330*3.14/180);
y1=y0+r*sin(330*3.14/180);

координаты "левой" вершины
x2=x0+r*cos(210*3.14/180);
y2=y0+r*sin(210*3.14/180);

координаты "верхней" вершины
x3=x0+r*cos(90*3.14/180);
y3=y0+r*sin(90*3.14/180);

это в классических координатах, т.е. надо еще в "экранные" перенести

Последний раз редактировалось Stilet; 06.07.2010 в 11:26.
Snejnaya вне форума Ответить с цитированием
Старый 06.07.2010, 17:17   #13
satanclaus
Пользователь
 
Регистрация: 05.10.2009
Сообщений: 15
По умолчанию

не могу подобрать градус для правой вершины, и при изменении радиуса треугольник соскакивает

Последний раз редактировалось satanclaus; 06.07.2010 в 17:30.
satanclaus вне форума Ответить с цитированием
Старый 06.07.2010, 17:21   #14
Snejnaya
Форумчанин
 
Регистрация: 12.05.2010
Сообщений: 219
По умолчанию

в смысле при "разных радиусах"?
по этим формулам
Цитата:
координаты "правой" вершины
x1=x0+r*cos(330*3.14/180);
y1=y0+r*sin(330*3.14/180);

координаты "левой" вершины
x2=x0+r*cos(210*3.14/180);
y2=y0+r*sin(210*3.14/180);

координаты "верхней" вершины
x3=x0+r*cos(90*3.14/180);
y3=y0+r*sin(90*3.14/180);
можно нвычислить координаты вершин треугольника любого радиуса. Т.е. вычислили 3 пары координат с одним радиусом - нарисовали большой треугольник. Потом вычислили три пары координат для другого радиуса - нарисовали малый треугольник. Ничего соскакивать не может. Ну, естественно, надо все координаты в int преобразовывать.
Snejnaya вне форума Ответить с цитированием
Старый 06.07.2010, 17:41   #15
Snejnaya
Форумчанин
 
Регистрация: 12.05.2010
Сообщений: 219
По умолчанию

если под "соскакивает" ты имел в виду, что он сразу пропадает, так это не в вычислении координат дело. Надо просто не забывать про Brush->color и Pen->Color
Например:

Код:
r=150;
x0=200;
y0=200;

x[0]=(int)(x0+r*cos(330*3.14/180));
y[0]=(int)(y0+r*sin(330*3.14/180));

x[1]=(int)(x0+r*cos(210*3.14/180));
y[1]=(int)(y0+r*sin(210*3.14/180));

x[2]=(int)(x0+r*cos(90*3.14/180));
y[2]=(int)(y0+r*sin(90*3.14/180));

Form1->Canvas->Brush->Color=clMaroon;
Form1->Canvas->Pen->Color=clMaroon;
Form1->Canvas->MoveTo(x[0],y[0]);
Form1->Canvas->LineTo(x[1],y[1]);
Form1->Canvas->LineTo(x[2],y[2]);
Form1->Canvas->LineTo(x[0],y[0]);

Form1->Canvas->FloodFill(x0,y0,clMaroon,1);
по хорошему надо по функциям разбить код - отдельно вычисление координат, отдельно рисование, но это так, черновой набросок.
Snejnaya вне форума Ответить с цитированием
Старый 06.07.2010, 18:44   #16
satanclaus
Пользователь
 
Регистрация: 05.10.2009
Сообщений: 15
По умолчанию

Большое спасибо!!! Всё сделал!
Но вопрос как перевернуть рисунок правильно а то при изменении градусов или треугольник не равносторонний, или весь пеинтбох красний.

и как можна сделать исключения к етой программе????

Код:
int r=StrToInt(Edit1->Text);
int x0=200;
int y0=200;
int x[3],y[3];
x[0]=(int)(x0+r*cos(330*3.14/180));
y[0]=(int)(y0+r*sin(330*3.14/180));

x[1]=(int)(x0+r*cos(210*3.14/180));
y[1]=(int)(y0+r*sin(210*3.14/180));

x[2]=(int)(x0+r*cos(90*3.14/180));
y[2]=(int)(y0+r*sin(90*3.14/180));

PaintBox1->Canvas->Brush->Color=clMaroon;
PaintBox1->Canvas->Pen->Color=clMaroon;
PaintBox1->Canvas->MoveTo(x[0],y[0]);
PaintBox1->Canvas->LineTo(x[1],y[1]);
PaintBox1->Canvas->LineTo(x[2],y[2]);
PaintBox1->Canvas->LineTo(x[0],y[0]);

PaintBox1->Canvas->FloodFill(x0,y0,clMaroon,1);

        r=r-25;
x0=200;
 y0=200;

x[0]=(int)(x0+r*cos(330*3.14/180));
y[0]=(int)(y0+r*sin(330*3.14/180));

x[1]=(int)(x0+r*cos(210*3.14/180));
y[1]=(int)(y0+r*sin(210*3.14/180));

x[2]=(int)(x0+r*cos(90*3.14/180));
y[2]=(int)(y0+r*sin(90*3.14/180));

PaintBox1->Canvas->Brush->Color=clWhite;
PaintBox1->Canvas->Pen->Color=clWhite;
PaintBox1->Canvas->MoveTo(x[0],y[0]);
PaintBox1->Canvas->LineTo(x[1],y[1]);
PaintBox1->Canvas->LineTo(x[2],y[2]);
PaintBox1->Canvas->LineTo(x[0],y[0]);

PaintBox1->Canvas->FloodFill(x0,y0,clWhite,1);
satanclaus вне форума Ответить с цитированием
Старый 06.07.2010, 20:01   #17
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Лови код. Треугольник поворачивается и изменяется в размерах.
TrackBar1 - Min = 0
Max = 360

TrackBar1 - Min = 0
Max = 200
Это в инспекторе объектов.
Оба TrackBar-а подключены к одному обработчику.

#include <vcl.h>
#pragma hdrstop
#include "math.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

int X=200;
int Y=200;

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
Triangle(X,Y,TrackBar2->Position,TrackBar1->Position,clRed, true);
Triangle(X,Y,TrackBar2->Position-10,TrackBar1->Position,clWhite, false);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Triangle(int x, int y, int r, int s, TColor C, bool D)
{
double L=M_PI/180;
int a=s+120, b=a+120, c=b+120;
Canvas->Brush->Color = clWhite;
if(D)Canvas->FloodFill(x+r*cos(a*L),y+r*sin(a*L ),clWhite,fsBorder);
Form1->Canvas->Brush->Color=C;
TPoint points[3];
points[0] = Point(x+r*cos(a*L),y+r*sin(a*L));// Верхняя
points[1] = Point(x+r*cos(b*L),y+r*sin(b*L));// Левая
points[2] = Point(x+r*cos(c*L),y+r*sin(c*L));// Правая
Form1->Canvas->Polygon(points, 3);
}
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 06.07.2010 в 21:40.
Smitt&Wesson вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с графикой в С# Ksanfur Помощь студентам 1 16.04.2010 23:39
Работа с графикой! Gladiator Фриланс 6 10.03.2010 18:47
Работа с графикой Geddar PHP 0 11.09.2009 07:22
Работа с графикой EdNovice Общие вопросы .NET 0 11.03.2009 11:09
Работа с графикой kminas Общие вопросы Delphi 5 21.11.2008 00:02