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

Тема в разделе "C/C++/C#", создана пользователем -, 12 дек 2010.

  1. Гость

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


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

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

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

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

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

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Циклом все точки обошел и сдвинул их...

    Координаты x домножаешь на (-1) и все... (только начало координат конечно должны быть выбраны например в центре экрана, что бы не строить фигуру за экран....
     
  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);
    }
    }
    }


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

    Inna1988 Гость




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

    Вложения:

    • 27.11View.txt
      Размер файла:
      2,4 КБ
      Просмотров:
      11
    • 27.11Viewh.txt
      Размер файла:
      1,1 КБ
      Просмотров:
      10
    • 27.11Doc.cpp.txt
      Размер файла:
      1,2 КБ
      Просмотров:
      12
    • 27.11Doc.h.txt
      Размер файла:
      616 байт
      Просмотров:
      11
    • 27.11.cpp.txt
      Размер файла:
      3,4 КБ
      Просмотров:
      12
    • 27.11.h.txt
      Размер файла:
      508 байт
      Просмотров:
      12
    • MainFrm.cpp.txt
      Размер файла:
      1,9 КБ
      Просмотров:
      9
    • MainFrm.h.txt
      Размер файла:
      737 байт
      Просмотров:
      6
  5. Гость

    А в нём есть функции сдвига и симметричного отображения??
     
  6. Inna1988

    Inna1988 Гость

    там есть:

    карандаши разных цветов рисуют линиями прямыми. сохраняется все , запоминается и снова воспроизводится
     
  7. Гость

    К несчастью,мне не это нужно!Но всё равно спасибо! :(
     
  8. Inna1988

    Inna1988 Гость

    незачто , самой подобное нужно будет скоро))) удачи
     
  9. Гость

    Как справлюсь,могу поделиться!:)
    А пока надо дерзать! :(
     
  10. Гость

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

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    ну так выложите. кому надо тот найдет)
     
  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); }

    //---------------------------------------------------------------------------
     
Загрузка...

Поделиться этой страницей