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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2008, 01:30   #1
Oliver
 
Регистрация: 24.12.2008
Сообщений: 4
По умолчанию "Редактор отрезков"

Требуется создать несложный редактор в С++ Builder, который позволит делать следующие вещи:
1. Рисовать отрезки.
2. Начинать или заканчивать отрезок с уже существующей точки (такой себе "эффект прилипания").
3. Перемещать точки с последующей сменой всего изображения.
4. Удалять точки и отрезки.

Фактически это не сильно сложно: рисую на канве, запоминаю точки в довольно хитрую динамическую структуру..

Проблема вот какая: поскольку я использую режим рисования pmXor (или pmNotXor - почти неважно) при перекрытии
отрезков под малыми углами возникают "пустые области". При использовании других режымов могут возникнуть " висящие"
пиксели, особо во время перемещения точек.

Вот так...
Может кто нибуть что-то подскажет. Может вообще другая идея прорисовки. Буду благодарен за любую информацию.

Модератор: я именно про код и говорил. Без него тут сложно разобраться.
Cogito, ergo sum.

Последний раз редактировалось MaTBeu; 24.12.2008 в 16:21.
Oliver вне форума Ответить с цитированием
Старый 24.12.2008, 01:52   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,619
По умолчанию

Правила постановки вопроса прочитайте. Вверху раздела.
MaTBeu вне форума Ответить с цитированием
Старый 24.12.2008, 14:02   #3
Oliver
 
Регистрация: 24.12.2008
Сообщений: 4
По умолчанию

По моему приблизительно по шаблону. Извините, конечно.
Добавлю код.

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

/*typedef struct _TEnding
        {
                TPoint p;
                _TEnding* next;
                } * PEnding;
typedef struct TLine
        {
                PEnding p1, p2;
                }

*/

/*typedef struct TLink * PLink;

typedef struct TMyPoint
        {
                TPoint p;
                TMyPoint* next;
                int LinkNumber;
                PLink links;
                } * PMyPoint;

typedef struct TLink
        {
                TPoint NextPoint;
                PLink next;
                } * PLink;
*/


typedef struct TLink * PLink;

class TMyPoint
{
        private:
                TPoint p;                 // Coordinates
                TMyPoint * next;          // Next point
//                TMyPoint * end;           // End of structure
                int LinkNumber;
                PLink links;              // Links of current point

        public:
                TMyPoint(int x, int y);         // Constructor
                void AddPoint(TMyPoint * myp);  // Add new point to the end
                void Connect(TMyPoint * myp); // Connect two points
                TMyPoint* Find(int x, int y);
                void Coords(int & x, int & y);
        };

typedef struct TLink
        {
                TMyPoint * nextPoint;
                PLink next;
                } * PLink;

// Private



// Public
TMyPoint::TMyPoint(int x, int y)
{
        p.x = x;
        p.y = y;
        LinkNumber = 0;
        next = NULL;
//        end = this;
        }

void TMyPoint::AddPoint(TMyPoint * myp)
{
//        end->next = p1;
//        end = p1;
        TMyPoint * tmp = this;
//        if (!tmp) tmp = myp;
//        else
//        {
                while (tmp->next != NULL)
                        tmp = tmp->next;
                tmp->next = myp;
//                }
        }

void TMyPoint::Connect(TMyPoint * myp)
{
        if (!LinkNumber)
        {
                links = new TLink;
                links->nextPoint = myp;
                links->next = NULL;
                }
        else
        {
                PLink tmp = links;
                while(tmp->next)
                        tmp = tmp->next;
                tmp->next = new TLink;
                tmp = tmp->next;
                tmp->nextPoint = myp;
                tmp->next = NULL;
                }
        LinkNumber++;
        }

TMyPoint* TMyPoint::Find(int x, int y)
{
        TMyPoint * tmp = this;
        while(tmp)
        {
                if ((abs(tmp->p.x-x)<5)&&(abs(tmp->p.y-y)<5))
                return tmp;
                tmp = tmp->next;
                }
        return NULL;
        }


void TMyPoint::Coords(int & x, int & y)
{
        x = p.x;
        y = p.y;
        }
        

int NewLine = 0;
int Drawing = 0;
TMyPoint * begin, * end;
TMyPoint * Points = NULL;
int x0, y0, x1, y1;
int incl1, incl2;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
Cogito, ergo sum.
Oliver вне форума Ответить с цитированием
Старый 24.12.2008, 14:03   #4
Oliver
 
Регистрация: 24.12.2008
Сообщений: 4
По умолчанию

Продолжение - обработчики

Код:
//---------------------------------------------------------------------------


void __fastcall TForm1::PaintBoxMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
        begin = NULL;

        Form1->Caption = Form1->Caption+'1';

        if (Points)
        {
                if (Points->Find(X, Y) != NULL)
                {
                        begin = Points->Find(X, Y);
                        incl1 = 1;
                        }
                else
                {
                        begin = new TMyPoint(X, Y);
//                        Points->Connect(begin);
                        incl1 = 0;
                        }
                }
        else
        {
                begin = new TMyPoint(X, Y);
//                Points = begin;
                }

        Drawing = 1;
        begin->Coords(x0, y0);
        x1 = x0;
        y1 = y0;
        PaintBox->Canvas->Pen->Color = clBlue;
        PaintBox->Canvas->Pen->Mode = pmNotXor;
        PaintBox->Canvas->Brush->Style = bsClear;
        if (!incl1) PaintBox->Canvas->Rectangle(x0-3, y0-3, x0+3, y0+3);
//        NewLine = 1;
        }
//---------------------------------------------------------------------------



void __fastcall TForm1::PaintBoxMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
        if (Drawing)
        {
                PaintBox->Canvas->MoveTo(x0, y0);
                PaintBox->Canvas->LineTo(x1, y1);
                PaintBox->Canvas->MoveTo(x0, y0);
                PaintBox->Canvas->LineTo(X, Y);
                x1 = X;
                y1 = Y;
                }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::PaintBoxMouseUp(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
        if (Drawing)
        {
                Drawing = 0;
                end = NULL;
                if(Points)
                {
                        if (Points->Find(X,Y))
                        {
                                PaintBox->Canvas->MoveTo(x0, y0);
                                PaintBox->Canvas->LineTo(x1, y1);
                                end = Points->Find(X,Y);
                                end->Coords(x1, y1);
                                PaintBox->Canvas->Pen->Mode = pmCopy;
                                PaintBox->Canvas->Pen->Color = clBlue;
                                PaintBox->Canvas->MoveTo(x0, y0);
                                PaintBox->Canvas->LineTo(x1, y1);
                                incl2 = 1;
                                }
                        else
                        {
                                end = new TMyPoint(X, Y);
//                              Points->Connect(begin);
                                incl2 = 0;
                                }
                        }
                 else
                 {
                        end = new TMyPoint(X, Y);
                        }
                 if (Points == NULL) Points = begin;
                 else
                        if (!incl1) Points->AddPoint(begin);
                if (!incl2) Points->AddPoint(end);
                if (!incl2) PaintBox->Canvas->Rectangle(x1-3, y1-3, x1+3, y1+3);
                 }
}
//---------------------------------------------------------------------------
Cogito, ergo sum.
Oliver вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мой первый редактор для игры:"Лесной мир". Манжосов Денис :) Gamedev - cоздание игр: Unity, OpenGL, DirectX 38 09.03.2011 17:37
Помогите с программой на С++ "текстовый редактор с поддержкой нескольких кодировок" alwa Помощь студентам 1 05.06.2008 19:48
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51
Редактор для "Команч 4" Air Свободное общение 0 31.05.2008 13:54
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49