Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 73

Перерисовка точек через координаты при масштабировании

03.04.2016, 16:25. Показов 2292. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Несколько тем назад спрашивала про масштабирование)
Совсем ничего придумать не могу.
есть Image, который масштабируется, но на всем есть точки Shape, нужно чтобы они при изменении масштаба оставались на тех же местах относительно рисунка, понимаю, что надо удалить все точки старые и по новому перерисовать по координатам из таблицы, предварительно пересчитав из через масштаб. но не могу это реализовать, одна точка получатся, но при цикле ничего не выходит.
помогите, пожалуйста!!
Вложения
Тип файла: rar Действующий.rar (769.3 Кб, 8 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.04.2016, 16:25
Ответы с готовыми решениями:

Image. Привязаться к участку изображения, или изменять координаты вывода на canvas при масштабировании
Здравствуйте! Вывожу текст с Edit на Image в определенном мести изображения. При масштабировании картинки, вывод текста не смещается,...

У квадрата ABCD на плоскости известны координаты двух противоположных вершин - точек A и C. Найти координаты точек B и
У квадрата ABCD на плоскости известны координаты двух противоположных вершин - точек A и C. Найти координаты точек B и D. Расположение...

Дано координаты точек x1x2x3. и уравнение прямой y=ax+b вывести масив С в котором координаты точек этой прямой
Пытался сделать так потому что забыл как решение примера занести в масив на выводе огромные числа подскажите где ошыбка #include...

16
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
03.04.2016, 16:28
Хорошим тоном считается выкладывать свои наработки. Глядишь, с большей вероятностью кто-то поможет.
0
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 73
03.04.2016, 16:30  [ТС]
gunslinger, в прикрепленных весь проект)) не сразу смогла его прикрепить)
0
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
03.04.2016, 19:19
Для каждой существующей точки пересчитываешь координаты в зависимости от масштаба.
Если для одной точки выходит, то в чем проблема для всех точек?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.04.2016, 19:39
TPaintBox::OnPaint + Canvas->Ellipse()

Краткое руководство по работе с классом TCanvas для начинающих
0
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 73
03.04.2016, 21:15  [ТС]
gunslinger,
видимо, у меня проблемы с циклом получаются и не могу удалить старые точки, в общем в конце концом я все окончательно сломала и ничего не рисует, но даже если и рисовалась одна, ее функции как у других не сохранялись(
я в отчаянии(
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
03.04.2016, 23:23
Цитата Сообщение от Tanok Посмотреть сообщение
я в отчаянии
Вот это ни к чему
Цитата Сообщение от Tanok Посмотреть сообщение
понимаю, что надо удалить все точки старые
Ошибочно так думать. Если принять аналогию шахмат на доске, то ваши рассуждения, как я понял, основаны на доске нарисованной; то-есть чтоб переместить фигуру, её нужно сначала стереть со старой клетки и нарисовать на новой. Но компонент точки (Shape) - это прообраз реальной фигуры, - не нарисованной. И её можно сколько угодно переставлять на другие поля (менять координаты Left Top). Достаточно пройти по таблице и скорректировать значения X и Y как по кнопке ( *Edit1->Text.ToIntDef(100))/100 )
0
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 73
03.04.2016, 23:44  [ТС]
nick42, но ведь если делать корректировку каждой координаты, получается меняем значения в таблице( чего бы не хотелось), или все равно отрисовывается по-новому, очень хочу понять, но не могу
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
03.04.2016, 23:48
Цитата Сообщение от Tanok Посмотреть сообщение
очень хочу понять, но не могу
Эт потому что поздно уже и.. весна. В таблице можно не менять значения, но из неё эти значения берём, чтобы пересчитать (по масштабу) координаты и установить новые значения Left Top для каждой реальной (видимой) точки.
0
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 73
04.04.2016, 10:02  [ТС]
nick42,
может быть, сейчас совсем глупость сделала
но как-то примерно так должно выглядеть?[C]TableShape *tq = dynamic_cast<TableShape *>(Sender);
C++
1
2
3
4
5
6
TableShape *tq = dynamic_cast<TableShape *>(Sender);
     int  X=StrToInt(StringGrid1->Cells[1][1]);
     int Y=StrToInt(StringGrid1->Cells[1][2]);
 
     tq->Left = (X*Edit1->Text.ToIntDef(100))/100;
     tq->Top = (Y*Edit1->Text.ToIntDef(100))/100;
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
04.04.2016, 10:35
Ну, примерно. Только Sender'а в вашем случае не будет. Элемент нужно из стринггрида "вытаскивать, по индексу или поиском (я не вникал, как вы этот массив организовали).
0
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 73
14.04.2016, 20:09  [ТС]
nick42, вот еще раз жутко извиняюсь, но до сих пор так и не поборола. Проблема в том, что пытаюсь собрать и понять, но со вторым сложнее:
Здесь код, когда тогда перемещается, удаляется и ставится.
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
134
135
136
137
138
139
140
141
142
143
144
145
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
  if(Button==mbLeft)
  {
     int n=StrToInt(StringGrid1->RowCount);
      n=n-1;
 
     TableShape *shape = new TableShape(this, n);
     shape->Parent = ScrollBox1;
     shape->Brush->Color = clRed;
     shape->Shape = stCircle;
     shape->Pen->Width = 0;
     shape->Width = 5*(Edit1->Text.ToIntDef(100)/100);
     shape->Height = 5*(Edit1->Text.ToIntDef(100)/100);
     shape->Left = Image1->Left+X;
     shape->Top = Image1->Top+Y;
     shape->Tag = Shapes.size();
     shape->OnMouseUp = to99MouseUp;
     shape->OnMouseDown = to99MouseDown;
     shape->OnMouseMove = to99MouseMove;
     Shapes.push_back(shape);
 
     Label1->Caption = "Òî÷åê âñåãî: " + String(Shapes.size());
     StringGrid1->Cells[1][n]=X;
     StringGrid1->Cells[2][n]=Y;
     StringGrid1->Cells[0][n]="Òî÷êà "+String(n);
     StringGrid1->Cells[1][n + 1] = "";
     StringGrid1->Cells[2][n + 1] = "";
     StringGrid1->Cells[0][n + 1] ="";
     StringGrid1->RowCount = n + 2;
  }
 
}
//---------------------------------------------------------------------------
 
 
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
W = Form1->Image1->Width;
H = Form1->Image1->Height;
StringGrid1->Cells[0][0]="Ìåòêà";
StringGrid1->Cells[1][0]="X";
StringGrid1->Cells[2][0]="Y";
StringGrid1->Cells[0][1]="Òî÷êà 1";
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::to99MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
   Image1->Cursor=crHandPoint;
    int line;
   TableShape *tq = dynamic_cast<TableShape *>(Sender);
   if(Button == mbRight)
  {
     tq->Hide();
     std::list<TableShape*>::iterator it;
     for(it = Shapes.begin(); it != Shapes.end(); it++)
        if(tq == *it)
            break;
     it = Shapes.erase(it);
     for(; it != Shapes.end(); it++)
     {
        line = (*it)->GetLine() - 1;
        (*it)->SetLine(line);
        StringGrid1->Cells[0][line + 1] = "Òî÷êà " + IntToStr(line);
     }
     ((TPublicGrid*)StringGrid1)->DeleteRow(tq->GetLine());
     delete tq;
     Label1->Caption = "Òî÷åê âñåãî: "+String(Shapes.size());
  }
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::to99MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
    Image1->Cursor=crHandPoint;
 TableShape *tq = dynamic_cast<TableShape *>(Sender);
   TRect re = Image1->ClientRect;
   TPoint pt = Point(tq->Left-Image1->Left+6,tq->Top-Image1->Top+6);
   if( PtInRect(&re,pt))
   if(Shift.Contains(ssLeft))
   {
     tq->Left += X-mx;
     tq->Top += Y-my;
     Label1->Caption = "Êîîðäèíàòû ìûøè: "
       "X="+String(tq->Left)+" Y="+String(tq->Top);
     StringGrid1->Cells[1][tq->GetLine()] = tq->Left;
     StringGrid1->Cells[2][tq->GetLine()] = tq->Top;
   }
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::to99MouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
Image1->Cursor=crHandPoint;
if(Button == mbLeft) { mx = X; my = Y; }
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{
 
    if(!jp) jp = new TJPEGImage();
      jp->LoadFromFile(OpenPictureDialog1->FileName);
      Graphics::TBitmap *im0 = new Graphics::TBitmap();
      im0->Assign(jp);
 
      Image1->Width  = (jp->Width*Edit1->Text.ToIntDef(100))/100;
      Image1->Height = (jp->Height*Edit1->Text.ToIntDef(100))/100;
 
      Image1->Picture->Bitmap->Width  = Image1->Width;
      Image1->Picture->Bitmap->Height = Image1->Height;
 
 
         int x = Image1->Picture->Width;
         int y = Image1->Picture->Height;
 
       TRect reta = Image1->BoundsRect,
            reso = Rect(0,0,jp->Width,jp->Height);
          Image1->Center=true;
         if(x<W && y<H)
      {
 
        Image1->Width=W;
        Image1->Height=H;
      }
 
      Image1->Picture->Bitmap->Canvas->CopyRect(reta,
        im0->Canvas,reso);
 
 
      delete im0;
 
TableShape *tq = dynamic_cast<TableShape *>(Sender);
 
 
     tq->Left = (Left*Edit1->Text.ToIntDef(100))/100;
     tq->Top =(Top*Edit1->Text.ToIntDef(100))/100;
       delete tq;
Ведь получается можно только переписать параметры каждой точки, не строгая стринггрид. И или в любом случае нужно к нему обращаться, "методом тыка" пробовала много вариантов, но все безуспешно..
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class TableShape : public TShape
    {
        int Line;
    public:
        TableShape (TForm* Owner, int Line) :
            TShape(Owner), Line(Line)
        {
     
        }
        void SetLine(int _Line)
        {
            Line = _Line;
        }
        int GetLine() const
        {
            return Line;
        }
    };
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
15.04.2016, 15:08
Для лучшего понимания - вот пример закрашивания выбранной в таблице точки в желтый цвет__
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
      int ARow, bool &CanSelect)
{ 
     TableShape *tq ;
     std::list<TableShape*>::iterator it;
     for(it = Shapes.begin(); it != Shapes.end(); it++) {
       tq = *it;
       if( tq->Left+2 ==StringGrid1->Cells[1][ARow].ToInt() &&
           tq->Top +2 ==StringGrid1->Cells[2][ARow].ToInt())
             tq->Brush->Color = clYellow  ;
       else  tq->Brush->Color = clRed;
     }
}
То-есть по щелчку мыши в таблице точек в цикле сравниваются координаты X и Y выбранной точки (скорректированные на величину радиуса точки: 2) со значениями Left и Top текущего шейпа-точки - tq. При совпадении точка tq перекрашивается в желтый цвет; при несовпадении - цвет красный.
Насколько я в курсе вашей проблемы с отображением точек в "окне линзы", - вам нужно всего лишь добавлять новые точки на Image линзы по количеству попавших точек в область прямоугольника "линзы". Масштабировать их не нужно, а нужно просто пересчитать координаты их положения с учетом положения рамки и точек-оригиналов. Для определения наличия точки внутри рамки (прямоугольника) можно применить функцию PtInRect().
0
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 73
15.04.2016, 18:55  [ТС]
сейчас попробую разобраться))

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


0
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 73
15.04.2016, 20:22  [ТС]
ввела цикл, по строкам чтобы перебил
но при одной точке все прекрасно работает он перерисовывает, но если точек больше, удаляет все кроме последней. но ее масштабирует..нужно как то по другому их связать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   int n=StrToInt(StringGrid1->RowCount)-1;
      TableShape *tq ;
    std::list<TableShape*>::iterator it;
    for(it = Shapes.begin(); it != Shapes.end(); it++) {
       tq = *it;
          int i=1;
         for (i; i< n; i++)
         {
          int X =StringGrid1->Cells[1][i].ToInt()-ww;
          int Y =StringGrid1->Cells[2][i].ToInt()-hh;
           tq->Left= X*Edit1->Text.ToIntDef(100)/100;
           tq->Top=Y*Edit1->Text.ToIntDef(100)/100;
          }
   }
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
15.04.2016, 22:12
..а где вы логику оставили?
Смотрите: внешним циклом (по it) вы последовательно присваиваете виртуальной "точке" tq все позиции "точек" списка; а внутренним циклом - по i - вы перемещаете эту несчастную виртуальную точку n раз, - сколько строк, то-есть точек, в таблице. Где она после этих перемещений окажется - одному богу известно. Цикл нужен один, по строкам таблицы точек, но сначала по координатам точки из таблицы назначается виртуальной "точке" реальная из списка, а затем её координаты устанавливаются по новой, учитывая масштаб изображения (в таблице точек ничего изменять не нужно). Вот приблизительно так я это вижу.
0
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 73
16.04.2016, 11:07  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
..а где вы логику оставили?
ну я же девушка))

Но в а целом спасибо большое!, разобралась! все работает!
Очень вам благодарна, на терпеливые объяснения!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.04.2016, 11:07
Помогаю со студенческими работами здесь

Найти координаты точек С, если известны координаты точек А
в треугольнике ОАВ проведена медиана ОС. Найти координаты точек С, если известны координаты точек А (0;-4), В (5;-2)

Как изменить координаты точек на графике через массив?
Здравствуйте. Имеется алгоритм, который равномерно распределяет точки двух видов (красные кружки и синие треугольники) в окружности...

Выразите угловой коэффициент прямой через координаты точек
Прямая проходит через точки M(x1,y1) и N(x2,y2). Выразите угловой коэффициент этой прямой через координаты точек. Чему он будет равен, если...

Как через MouseDown забрать координаты нескольких точек?
Помогите решить вопрос, что-то не могу сообразить сам. На форме есть компонент Image1 Пользователь делает клик левой кнопкой мыши...

Описать класс треугольник через координаты трех точек
class Triangle { // поля double Ax; double Ay; double Bx; double By; ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru