![]() |
Система координат объекта Canvas. Проблема масштабированияTCanvas - объект для рисования на поверхности объектов. C++Builder и Delphi предоставляют расширенный доступ к Canvas используемых объектов. Такие классы объектов, как TForm, TLabel, TImage и другие позволяют использовать этот объект. Итак, суть проблемы.
Пример (VB):
picExample.DrawWidth = 2
picExample.Scale (-10, 10)-(10, -20)
picExample.PSet (0, 0)
picExample.Line (-8, 7)-(7, -15)
Код задает левую верхнюю и правую нижнюю координаты масштаба. Далее строятся точка и линия, причём по координатам, которые задаются методом Scale. В C++Builder и Delphi нет метода Scale и масштаб там следующий (0, 0)-(width, height), где width - ширина объекта, height - высота. Решение проблемы - переход к новым координатам. Необходимо сделать отображение (x0, y0)-->(x1, y1), где (x0, y0) - исходная точка, (x1, y1) - отображение точки в масштабе объекта (0, 0)-(width, height). Используем линейную замену:
Теперь, какое бы значение мы не поставили из области, ограниченной прямоугольником (xmin, ymax)-(xmax, ymin), мы получим значения, которые будут лежать в области, ограниченной прямоугольником (0, 0)-(width, height), то есть в области, соответствующей объекту Canvas. Реализацию такого отображения координат удобно выполнить с помощью класса с методами Scalе, X, Y, setHeight, setWidth.
Заголовочный файл класса
#ifndef ConvertXYH
#define ConvertXYH
class ConvertXY{
public:
ConvertXY();
void Scale(float, float, float, float);
int X(float);
int Y(float);
void setHeight(int);
void setWidth(int);
private:
float xmin, xmax, ymin, ymax;
float h, w;
};
#endif
Файл класса
#include "ConvertXY.h"
ConvertXY::ConvertXY() {
xmin = 0;
xmax = 100;
ymin = 0;
ymax = 100;
}
void ConvertXY::Scale(float x1, float y1, float x2, float y2) {
xmin = x1;
ymax = y1;
xmax = x2;
ymin = y2;
}
int ConvertXY::X(float x) {
return w * (xmin - x) / (xmin - xmax);
}
int ConvertXY::Y(float y) {
return -h * (ymax - y) / (ymin - ymax);
}
void ConvertXY::setHeight(int height) {
h = (height > 0) ? height : 0;
}
void ConvertXY::setWidth(int width) {
w = (width > 0) ? width : 0;
}
Файл формы
// ....
ConvertXY obj;
obj.setHeight(imgExample->Height);
obj.setWidth(imgExample->Width);
obj.Scale(-10, 10, 10, -20);
imgExample->Canvas->Pen->Width=2;
imgExample->Canvas->MoveTo(obj.X(0), obj.Y(0));
imgExample->Canvas->LineTo(obj.X(0), obj.Y(0));
imgExample->Canvas->MoveTo(obj.X(-8), obj.Y(7));
imgExample->Canvas->LineTo(obj.X(7), obj.Y(-15));
// ....
Теперь, легко можно осуществлять универсальное преобразование координат. Алексей Кощеев
14.10.2002 Ссылки друзей• Только сейчас куплю доску лиственницы по хорошей цене• Фотографии моделей мужчин портфолио модели. |
Ссылки друзей• блок питания универсальный для ноутбука. |
| © Алексей Кощеев, г.Киров, 2001-2012 |