Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисование графика с сохранением пропорций 
V
    Опции темы
BOB4uK
  Дата 7.2.2009, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 28.2.2004

Репутация: нет
Всего: нет



Я уже запутался с пропорцями для вписывания графика в какую-нибудь облость с сохранением пропорций!
Подскажите как правельно и самое главное быстро вписать график в заданную облость при этом сохранив пропорции графика?
Известна высота, ширина и координаты исходного графика, а так же высота и ширина облости в которую необходимо вписать…
Примеры на рисунке…
user posted image
PM MAIL ICQ   Вверх
SVN74
Дата 7.2.2009, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 11
Всего: 18



Надо вставить фотки или чисто такие штучки рисовать?
PM MAIL WWW   Вверх
BOB4uK
Дата 8.2.2009, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 28.2.2004

Репутация: нет
Всего: нет



чисто рисовать, координаты даны...
PM MAIL ICQ   Вверх
Voronin_Igor
Дата 8.2.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 14.7.2008
Где: Петрозаводск

Репутация: нет
Всего: нет



если отображать в разный окнах и что бы пропорции сохранялись, то в компоненте Image
нужно указать свойство proportional=true 
PM MAIL   Вверх
SVN74
Дата 8.2.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 11
Всего: 18



Цитата(BOB4uK @  8.2.2009,  08:15 Найти цитируемый пост)
чисто рисовать, координаты даны... 

 Ну тогда все вообще очень просто...
Надо создать массив координат точек, далее создать нужный нам размер окна, - к примеру можно для этого использовать компонент Image.
Как видно из рисунков, - объект привязан к нижнему - левому углу, поэтому мы высчитываем нужные нам две координаты X,Y относительно окна.
И самое главное, теперь мы смещаем весь рисунок в нужном нам направлении путем добавления X,Y к массиву координат нашего рисунка и получаем измененные координаты относительно окна. В принципе потом можно двигать весь рисунок по окну меняя X,Y.
Я бы использовал бы в данной ситуации библиотеку Canvas. которая заложена в компоненте Image.
Нет необходимости использовать здесь GDI.
 

PM MAIL WWW   Вверх
mrbrooks
Дата 9.2.2009, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Согласен с SVN74.
 Рисуй сразу на канве - зачем тянуть еще компонент. Можешь рисовать на TImage, а можешь и сразу на форме. По большому счету - разницы никакой. 
PM MAIL   Вверх
BOB4uK
Дата 9.2.2009, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 28.2.2004

Репутация: нет
Всего: нет



Я и так пользуюсь Canvas, суть вопроса НЕ В ТОМ, чтобы нарисовать картинку а потом выкинуть ее на экран например в TImage!!!

Нужно имея конкретную облость на экране , через канву нарисовать пропорционально график в этой облосте!!!
PM MAIL ICQ   Вверх
BOB4uK
Дата 9.2.2009, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 28.2.2004

Репутация: нет
Всего: нет



Цитата(SVN74 @ 8.2.2009,  13:48)
Цитата(BOB4uK @  8.2.2009,  08:15 Найти цитируемый пост)
чисто рисовать, координаты даны... 

 Ну тогда все вообще очень просто...
Надо создать массив координат точек, далее создать нужный нам размер окна, - к примеру можно для этого использовать компонент Image.
Как видно из рисунков, - объект привязан к нижнему - левому углу, поэтому мы высчитываем нужные нам две координаты X,Y относительно окна.
И самое главное, теперь мы смещаем весь рисунок в нужном нам направлении путем добавления X,Y к массиву координат нашего рисунка и получаем измененные координаты относительно окна. В принципе потом можно двигать весь рисунок по окну меняя X,Y.
Я бы использовал бы в данной ситуации библиотеку Canvas. которая заложена в компоненте Image.
Нет необходимости использовать здесь GDI.

А если координаты большие например 500;700 или отрицательные, то будет бяка же!?
PM MAIL ICQ   Вверх
SVN74
Дата 9.2.2009, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 11
Всего: 18



Цитата(BOB4uK @  9.2.2009,  18:40 Найти цитируемый пост)
А если координаты большие например 500;700 или отрицательные, то будет бяка же!? 

Не будет никакой бяки, если добавить к массиву кроме смещения еще и множинник (одну переменную), которая будет множится  на массив координат...

PM MAIL WWW   Вверх
BOB4uK
Дата 10.2.2009, 05:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 28.2.2004

Репутация: нет
Всего: нет



А как множитель высчитать общий для X и Y?
PM MAIL ICQ   Вверх
SVN74
Дата 10.2.2009, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 11
Всего: 18



Цитата(BOB4uK @  10.2.2009,  05:39 Найти цитируемый пост)
А как множитель высчитать общий для X и Y? 

Очень просто...
К примеру существует три координаты (фигура треугольник):
 
 X1 = 15; Y1 = 22;
 X2 = 60; Y2 = 10;
 X3 = 55; Y3 = 45;
 ===
Теперь не трудно себе представить. если мы все эти числа умножим к примеру на 10, то вся на фигура увечится в десять раз.
Но наша фигура при этом тоже сместится в сторону увеличения координат, то   для возврата нашей фигуры к стартовому положению, мы теперь  должны   отнять  от всех координат число N, чтобы сместить рисунок назад по координатах, но общий размер нашего треугольника теперь будет в десять раз больше.
А чтобы уменьшить размер фигуры к примеру в 10 раз, то множим на  0.1 + N (для смещения в нужную сторону).

Кроме  (N) можно еще прибавлять и отнимать X,Y соответственно их них координат...  

Это сообщение отредактировал(а) SVN74 - 10.2.2009, 19:52
PM MAIL WWW   Вверх
BOB4uK
Дата 11.2.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 28.2.2004

Репутация: нет
Всего: нет



Вот иходник того что я сделал:
Код

double w=MaxX-MinX,h=MaxY-MinY,k;
  

  if (w>h)
  {
    if (Width> Height) k= Height/w;
    else k= Width/w;
  }
  else
  {
    if (Height> Width) k= Width/h;
    else k= Height/h;
  }

  for (i = 0; i<count;i++)
  {
    point[i].x=(point[i].x-MinX)*k;
    point[i].y=(MaxY-point[i].y)*k;
  }

  for (i = 0; i<count;i++)
  {
    x=point[i].x;
    y=point[i].y;
 
     if (first) { Canvas->MoveTo(x,y); first=false; continue;}
    Canvas->LineTo(x,y);
  }


Пропорции сохраняются, но вписаны в квадрат, то есть остается не задейсвованая облость!!!
Как сденлать так чтобы рисовал на максимум доступной облости с сохранением пропорций?
На рисунке показана область (wD), которую не задействовал алгоритм…


Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  1.JPG 29,03 Kb
PM MAIL ICQ   Вверх
SVN74
Дата 12.2.2009, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 11
Всего: 18



Цитата(BOB4uK @  11.2.2009,  19:08 Найти цитируемый пост)
Как сденлать так чтобы рисовал на максимум доступной облости с сохранением пропорций?


Короче я тут специально набросал готовый примерчик, я думаю поможет:
Пример написан на CodeGear 2009.

Код

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

#include <vcl.h>
#pragma hdrstop

#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TPoint points[6];
int Num;
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
    : TForm(Owner)
{
  // Координаты треугольника
  points[0].x = 10;
  points[0].y = 50;

  points[1].x = 40;
  points[1].y = 5;

  points[2].x = 50;
  points[2].y = 80;

  points[3].x = 10;
  points[3].y = 50;

  Num = 4;  // число точек в фигуре
}
//---------------------------------------------------------------------------

void __fastcall TForm3::MyPaint(int X, int Y)
{
  Image1->Width = X; // Задаем нужный нам размер окна
  Image1->Height = Y;
   this->Canvas->FillRect(this->ClientRect);
   this->Canvas->TextOutA(10,40,L"Вариант - 1 (размер "+IntToStr(X)+"х"+IntToStr(Y));
  Image1->Canvas->FillRect(Image1->ClientRect);
  Image1->Canvas->Pen->Color = clRed;
    // Получаем координаты смещения
   int MinX = 1000;
   int MinY = 1000;
   int MaxX = 0;
   int MaxY = 0;
   for(int z=0;z<Num;z++)
   {
      if(MinX > points[z].x)
               MinX = points[z].x;
      if(MinY > points[z].y)
               MinY = points[z].y;
      if(MaxX < points[z].x)
               MaxX = points[z].x;
      if(MaxY < points[z].y)
               MaxY = points[z].y;
   }

    // Вычисляем множитель
   float N = (float) Image1->Width / (MaxX-MinX);
   float N2 = (float) Image1->Height / (MaxY-MinY);
         if(N>N2) N = N2;
   for(int z=0;z<Num;z++)
   {
       points[z].x -= MinX;
       points[z].y -= MinY;
       points[z].x *= N;
       points[z].y *= N;
   }
  Image1->Canvas->Polyline(points,Num-1);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
   MyPaint(300,300);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button2Click(TObject *Sender)
{
  MyPaint(100,300);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button3Click(TObject *Sender)
{
  MyPaint(500,150);
}
//---------------------------------------------------------------------------


+ готовый файл.

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  Project2.rar 269,28 Kb
PM MAIL WWW   Вверх
BOB4uK
Дата 13.2.2009, 06:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 28.2.2004

Репутация: нет
Всего: нет



Всего то не хвотало
if(N>N2) N = N2;

СПАСИБО! ЗАРАБОТАЛО КАК НАДО! 

Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  1.JPG 29,03 Kb
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0606 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.