Графический редактор

  • Автор темы Guest
  • Дата начала
G

Guest

#1
Здравствуйте!
Мне нужно создать графический редактор,в котором можно будет строить многоугольники,выбирать цвета фона и контура,сохранять в цифровом формате(х, у),открывать ранее сохранённые объекты.
Также необходимо реализовать функции сдвига и симметричного отображения. Рекомендуется применение структурных массивов.
Язык С++


Основа готова,многоугольники строит,можно выбирать и изменять цвет,сохранять и открывать ранее созданное.
Не могу разобраться с двумя функциями:сдвиг и симметричное отображение.А без них программа ничего не стоит!

Понимаю идею,но не могу реализовать. :)

Что касается сдвига: ввожу в компонент Edit,например, число,которое и будет шагом,на который нужно сместить изображение,считываю его.
А вот как сам цикл записать не знаю. :(

А насчёт симметричного изображения(относительно вертикальной оси) та же история.
У меня такая идея:определяю какая из вершин многоугольника стоит дальше всех по оси X,отступаю вправо от этой точки произвольную величину,провожу вертикальную линию(ось,относительно которой будет произведена симметрия),затем определяю расстояние(обозначим d) от каждой вершины многоугольника до этой оси и откладываю это же расстояние вправо,то есть к каждой вершине многоугольника прибавляю расстояние 2d.Соединяю.

Изложила свои соображения.Буду очень благодарна,если кто-нибудь откликнется!
Если нужно что-нибудь уточнить,я к вашим услугам
:)
 

DarkKnight

Well-known member
01.08.2010
653
0
#2
Что касается сдвига: ввожу в компонент Edit,например, число,которое и будет шагом,на который нужно сместить изображение,считываю его.
А вот как сам цикл записать не знаю.
Циклом все точки обошел и сдвинул их...

А насчёт симметричного изображения(относительно вертикальной оси) та же история.
Координаты x домножаешь на (-1) и все... (только начало координат конечно должны быть выбраны например в центре экрана, что бы не строить фигуру за экран....
 
G

Guest

#3
Спасибо за ответ!
Но в том-то и дело,что не получается.

Код для рисования многоугольника:
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(v==1){ // рисование многоугольника
if(Shift.Contains(ssLeft)){
mast.x=X;
mast.y=Y;
//Image1->Canvas->Brush->Color=clWhite;
//Image1->Canvas->TextOutA(X,Y+5,i+1);
Image1->Canvas->Brush->Color=clRed;
Image1->Canvas->Ellipse(X-3,Y-3,X+3,Y+3);
i++;}
if(i>0){
for(int j=0;j<i-1;j++){
Image1->Canvas->Pen->Color=(ColorDialog1->Color);
Image1->Canvas->MoveTo(mast[j].x,mast[j].y);
Image1->Canvas->LineTo(mast[j+1].x,mast[j+1].y);
}
}

}

А вот для сдвига:

void __fastcall TForm1::N11Click(TObject *Sender)
{
// раздел меню Инструменты | Сдвиг
k=StrToInt(Edit1->Text);
if(i>0){
for(int j=0;j<i-1;j++){
Image1->Canvas->Pen->Color=(ColorDialog1->Color);
Image1->Canvas->MoveTo(mast[j+k].x,mast[j].y);
Image1->Canvas->LineTo(mast[j+1+k].x,mast[j+1].y);
}
}
}


Получается ерунда!
Мне самой не справиться.
 
I

Inna1988

#4
Спасибо за ответ!
Но в том-то и дело,что не получается.

Код для рисования многоугольника:
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(v==1){ // рисование многоугольника
if(Shift.Contains(ssLeft)){
mast.x=X;
mast.y=Y;
//Image1->Canvas->Brush->Color=clWhite;
//Image1->Canvas->TextOutA(X,Y+5,i+1);
Image1->Canvas->Brush->Color=clRed;
Image1->Canvas->Ellipse(X-3,Y-3,X+3,Y+3);
i++;}
if(i>0){
for(int j=0;j<i-1;j++){
Image1->Canvas->Pen->Color=(ColorDialog1->Color);
Image1->Canvas->MoveTo(mast[j].x,mast[j].y);
Image1->Canvas->LineTo(mast[j+1].x,mast[j+1].y);
}
}

}

А вот для сдвига:

void __fastcall TForm1::N11Click(TObject *Sender)
{
// раздел меню Инструменты | Сдвиг
k=StrToInt(Edit1->Text);
if(i>0){
for(int j=0;j<i-1;j++){
Image1->Canvas->Pen->Color=(ColorDialog1->Color);
Image1->Canvas->MoveTo(mast[j+k].x,mast[j].y);
Image1->Canvas->LineTo(mast[j+1+k].x,mast[j+1].y);
}
}
}


Получается ерунда!
Мне самой не справиться.



попробуй соединить мои файлы , должен получиться граф редактор
 

Вложения

G

Guest

#10
Я справилась.Так что кому нужна программа,могу поделиться!
 
G

Guest

#12
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit3.h"
#include <fstream.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
struct Koord{
int x;
int y;
};
const int K=100;
Koord mast[K];
Koord mass[K];
int i=0,maxx,maxy,j,v,v1,k,step=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Image1->Canvas->Brush->Color=clWhite;
Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height));
Edit1->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(v==1){ // рисование многоугольника
if(Shift.Contains(ssLeft)){
mast.x=X;
mast.y=Y;
Image1->Canvas->Brush->Color=clRed;
Image1->Canvas->Ellipse(X-3,Y-3,X+3,Y+3);
i++;}

}

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
StatusBar1->SimpleText="x="+IntToStr(X)+" y="+IntToStr(Y);
}
//---------------------------------------------------------------------------


void __fastcall TForm1::N2Click(TObject *Sender)
{
// раздел меню Файл | Открыть
i=0;
if(OpenDialog1->Execute()){
ifstream fin(OpenDialog1->FileName.c_str());
if(!fin){ShowMessage("ERROR!Can't open the file!");}
char s;
int k=0;
while(!fin.eof()){
fin.get(s);
if(s=='\n') k++;}
k=k-1;
Koord *m=new Koord[k];
fin.close();
ifstream fin2(OpenDialog1->FileName.c_str());
if(!fin2){ShowMessage("ERROR!Can't open the file!");}
for(int j=0;j<k;j++){
fin2>>m[j].x>>m[j].y;
}
fin2.close();
for(int j=0;j<k;j++){
Image1->Canvas->Brush->Color=clRed;
Image1->Canvas->Ellipse(m[j].x-3,m[j].y-3,m[j].x+3,m[j].y+3);
i++;
}
for(int j=0;j<i-1;j++){
Image1->Canvas->Pen->Color=(ColorDialog1->Color);
Image1->Canvas->MoveTo(m[j].x,m[j].y);
Image1->Canvas->LineTo(m[j+1].x,m[j+1].y);
}
}
}
//---------------------------------------------------------------------------




void __fastcall TForm1::N3Click(TObject *Sender)
{
// раздел меню Файл | Сохранить
if(SaveDialog1->Execute()){
ofstream fout(SaveDialog1->FileName.c_str());
if(!fout){ShowMessage("ERROR!");}
for(int j=0;j<i;j++){
fout<<mast[j].x<<" "<<mast[j].y<<"\n";
}
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N4Click(TObject *Sender)
{
// раздел меню Файл | Выход
Close();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N7Click(TObject *Sender)
{
// раздел меню Файл | Очистить всё
Image1->Canvas->Brush->Color=clWhite;
Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height));
j=0;i=0;v1=0;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N9Click(TObject *Sender)
{
// раздел меню Инструменты | Выбор цвета
ColorDialog1->Execute();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N10Click(TObject *Sender)
{
// раздел меню О программе
Form3->ShowModal();
}
//---------------------------------------------------------------------------


void __fastcall TForm1::N13Click(TObject *Sender)
{
// раздел меню Инструменты | Многоугольник
v=1;
Image1->Canvas->Brush->Color=clWhite;
Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height));
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N11Click(TObject *Sender)
{
// раздел меню Инструменты | Сдвиг
Image1->Canvas->Brush->Color=clWhite;
Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height));
step=0;
step=step+StrToInt(Edit1->Text);
//if(!isdigit(k)){ShowMessage("Введите шаг!");}
//if(Shift.Contains(ssLeft)){
//mast.x=X;
//mast.y=Y;


for(int j=0;j<i;j++){
Image1->Canvas->Brush->Color=clRed;
Image1->Canvas->Ellipse(mast[j].x-3+step,mast[j].y-3,mast[j].x+3+step,mast[j].y+3);

}
if(i>0){
for(int j=0;j<i-1;j++){
Image1->Canvas->Pen->Color=(ColorDialog1->Color);
Image1->Canvas->MoveTo(mast[j].x+step,mast[j].y);
Image1->Canvas->LineTo(mast[j+1].x+step,mast[j+1].y);
}
}
Image1->Canvas->MoveTo(mast[i-1].x+step,mast[i-1].y);
Image1->Canvas->LineTo(mast[0].x+step,mast[0].y);
}
//---------------------------------------------------------------------------


void __fastcall TForm1::N12Click(TObject *Sender)
{
// раздел меню Инструменты | Симметричное отображение
int delta=50+step;
Image1->Canvas->Pen->Color=clRed;
Image1->Canvas->Pen->Width=1;

maxx=mast[0].x;
maxy=mast[0].y;
for(int j=0;j<i;j++){
if(mast[j].x>maxx){maxx=mast[j].x;
maxy=mast[j].y;} }
Image1->Canvas->MoveTo(maxx+delta,maxy);
Image1->Canvas->LineTo(maxx+delta,Image1->Height);
Image1->Canvas->MoveTo(maxx+delta,maxy);
Image1->Canvas->LineTo(maxx+delta,0);
//Image1->Canvas->MoveTo(maxx+2*delta,maxy);
//Image1->Canvas->Brush->Color=clRed;
//Image1->Canvas->Ellipse(maxx-3+2*delta,maxy-3,maxx+3+2*delta,maxy+3);


if(i>0){
for(int j=0;j<i;j++){
int dx=abs(maxx-mast[j].x)+delta;
mass[j].x=mast[j].x+2*dx;
mass[j].y=mast[j].y;
Image1->Canvas->Ellipse(mast[j].x-3+2*dx,mast[j].y-3,mast[j].x+3+2*dx,mast[j].y+3);
Image1->Canvas->Brush->Color=clRed;
Image1->Canvas->Pen->Color=(ColorDialog1->Color);
if(j==0){
Image1->Canvas->MoveTo(mass[j].x,mass[j].y); }
else{
Image1->Canvas->LineTo(mass[j].x,mass[j].y);
Image1->Canvas->MoveTo(mass[j].x,mass[j].y);}
}
}
Image1->Canvas->LineTo(mass[0].x,mass[0].y);

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(i>0){
for(int j=0;j<i-1;j++){
Image1->Canvas->Pen->Color=(ColorDialog1->Color);
Image1->Canvas->MoveTo(mast[j].x,mast[j].y);
Image1->Canvas->LineTo(mast[j+1].x,mast[j+1].y);
}}
Image1->Canvas->LineTo(mast[0].x,mast[0].y); }

//---------------------------------------------------------------------------