Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сетка на Image

249
30 мая 2005 года
DissDoc
639 / / 01.10.2004
Как нарисовать сетку в Image?
Ну т.е. есть
 
Код:
Image->Canvas->Brush->Color=clRed;

Хочу на этот Image натянуть сетку 100х100 "квадратиков". Никак догадаться не могу! Почему-то все закрашивается.... Я рисую Pen'ом.
У кого есть алгоритм или кусок программы... помогите, плз!
376
30 мая 2005 года
Absolut
220 / / 22.11.2002
Цитата:
Originally posted by DissDoc
Как нарисовать сетку в Image?
Ну т.е. есть
 
Код:
Image->Canvas->Brush->Color=clRed;

Хочу на этот Image натянуть сетку 100х100 "квадратиков". Никак догадаться не могу! Почему-то все закрашивается.... Я рисую Pen'ом.
У кого есть алгоритм или кусок программы... помогите, плз!



Ну, ежели рисуешь Pen'ом так и цвет надо Рen'у задавать.
Image->Canvas->Pen->Color=clRed;
А так вообще вот :

Код:
const int num = 100;
double step_y = (Image1->Width-1.0)/num;
double step_x = (Image1->Height-1.0)/num;
Image1->Canvas->Pen->Color = clRed;

for( int i=0; i<=num; ++i )
{
   // Горизонтальные линии
   Image1->Canvas->MoveTo( 0, i* step_x );
   Image1->Canvas->LineTo( Image1->Width-1, i* step_x);
   // Вертикальные линии
   Image1->Canvas->MoveTo( i* step_y, 0 );
   Image1->Canvas->LineTo( i* step_y, Image1->Height-1 );
}
249
30 мая 2005 года
DissDoc
639 / / 01.10.2004
Спасибо, помогло! Я просто не перемещал в начало кисти! В результате чего - собственно ничего и не получалось!
249
31 мая 2005 года
DissDoc
639 / / 01.10.2004
Я решил усложнить себе и другим жизнь... А если разбить карту не на 4хугольники, а на 6тиугольники (т.е. изобразить карту в виде сот)...
Кто-нибудь знает как это реализовать?
376
31 мая 2005 года
Absolut
220 / / 22.11.2002
Цитата:
Originally posted by DissDoc
Я решил усложнить себе и другим жизнь... А если разбить карту не на 4хугольники, а на 6тиугольники (т.е. изобразить карту в виде сот)...
Кто-нибудь знает как это реализовать?



А в чём собственно проблема ? Прикинул на бумажке как должно выглядеть. Нарисовал пару формул и пошёл клепать всё это дело в цикле. Главное состыковать соты между собой и дело в шляпе.

249
31 мая 2005 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by Absolut
А в чём собственно проблема ? Прикинул на бумажке как должно выглядеть. Нарисовал пару формул и пошёл клепать всё это дело в цикле. Главное состыковать соты между собой и дело в шляпе.


Я не прошу мне код написать, я лишь прошу сам принцип реализации помочь "написать на бумажке" ;)
Дело все в том, что немного не понятно, как ЭТО ВСЕ строится....

376
31 мая 2005 года
Absolut
220 / / 22.11.2002
Цитата:
Originally posted by DissDoc
Я не прошу мне код написать, я лишь прошу сам принцип реализации помочь "написать на бумажке" ;)
Дело все в том, что немного не понятно, как ЭТО ВСЕ строится....



Ну вот как-то так .. в первом приближении :

Код:
void __fastcall TForm1::DrawHoneyComb( TCanvas* canv, int X, int Y, int SideSize )
{
   double step_x = SideSize * 0.86602540;
   double step_y = SideSize * 0.5;

   canv->MoveTo( X, Y + step_y );

   canv->LineTo( X, Y + step_y + SideSize );
   canv->LineTo( X + step_x, Y + step_y * 2 + SideSize );

   canv->LineTo( X + step_x * 2, Y + step_y + SideSize );
   canv->LineTo( X + step_x * 2, Y + step_y );

   canv->LineTo( X + step_x, Y );
   canv->LineTo( X, Y + step_y );
}

// ----
   Image1->Canvas->Pen->Color = clRed;

   int SideSize = 40;
   double step_x = SideSize * 0.86602540 * 2;
   double step_y = SideSize * 1.5;
   bool shift = false;

   for( int i=0; i<Image1->Width; i += step_x )
   {
      for( int j=0; j<Image1->Height; j += step_y )
      {
         DrawHoneyComb( Image1->Canvas, i + shift*step_x/2.0, j, SideSize );
         shift = !shift;
      }

   }
249
31 мая 2005 года
DissDoc
639 / / 01.10.2004
А [COLOR=red]DrawHoneyComb[/COLOR] - это Image или что?
376
31 мая 2005 года
Absolut
220 / / 22.11.2002
Цитата:
Originally posted by DissDoc
А [COLOR=red]DrawHoneyComb[/COLOR] - это Image или что?



Это функция, описанная в самом начале :)
Созданная ручками :D

249
31 мая 2005 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by Absolut
Это функция, описанная в самом начале :)
Созданная ручками :D


Да! Это снова я и снова вопрос! Как закрасить эту 6тивершинную ячейку?
P.S> Я понимаю, что нужно выводить Image1->Canvas->Brush->Color=цвет_какой_захочу =))))

249
01 июня 2005 года
DissDoc
639 / / 01.10.2004
Лично у меня какая-то ошибка допущена...
Код такой
Код:
void DrawPal6( int X, int Y, int SideSize )
{
   double x = SideSize * 0.86602540;
   double y = SideSize * 0.5;

   Image1->Canvas->Brush->Color=clYellow;
   Image1->Canvas->FillRect(Rect(X, Y + y + SideSize, X + x, Y + y * 2 + SideSize );

   Image1->Canvas->FillRect(Rect(X + x * 2, Y + y + SideSize, X + x * 2, Y + y );

   Image1->Canvas->FillRect(Rect(X + x, Y, X, Y + y );
}


Это пока единственная идея, которая мне пришла в голову... Но она к сожаление рисует какие-то мелкие прямоугольники (хотя я по идее собрал из 3х прямоугольников 6тиугольник).

Вопросы такие:
1) Что тут неверное
2) Как можно нарисовать всего один 6тиугольник в заданном месте. Объясняю, у нас есть сетка (на соты разбитая) и я хочу нарисовать 6тиугольник в соте с координатами например (5;5)
249
01 июня 2005 года
DissDoc
639 / / 01.10.2004
А может хотя бы кто-нибудь подсказать хотя бы метод (алгоритм, формулу) для того, чтобы залитый квадрат превратить в 6тиугольник?
Для квадратта так
 
Код:
Image1->Canvas->Pen->Color=clBlack;
Image1->Canvas->Brush->Color=clYellow;
Image1->Canvas->Rectangle(10,10,40,40);


Но я никак не пойму как залить 6тиугольник, получается ерунда какая-то!!!!
10
01 июня 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by DissDoc
Но я никак не пойму как залить 6тиугольник, получается ерунда какая-то!!!!


Я вот тоже никак не пойму, прикалываешься ты или фигней занимаешься. Как можно с серьезным лицом пытаться нарисовать многоугольник квадратами?! Вспомни курс геометрии, блин! Любой многоугольник можно представить в виде набора треугольников, но никак не квадратов. Поэтому, кстати, графические ускорители работают с треугольниками.

Теперь по делу. Метод TCanvas::Polygon() и аналогичные API-шные функции вроде до сих пор работали.

249
01 июня 2005 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by Freeman
Я вот тоже никак не пойму, прикалываешься ты или фигней занимаешься. Как можно с серьезным лицом пытаться нарисовать многоугольник квадратами?! Вспомни курс геометрии, блин! Любой многоугольник можно представить в виде набора треугольников, но никак не квадратов. Поэтому, кстати, графические ускорители работают с треугольниками.

Теперь по делу. Метод TCanvas::Polygon() и аналогичные API-шные функции вроде до сих пор работали.



Спасибо за помощь, но я нашел ОТЛИЧНУЮ функцию для моей цели FloodFill!
Собсно вот сама реализация, знаете штука полезная!

 
Код:
void WritePix(TColor col, int x, int y)
{
Form1->Image1->Canvas->Brush->Color=col;
Form1->Image1->Canvas->FloodFill(x, y, clBlack, fsBorder);
}
10
02 июня 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by DissDoc
Спасибо за помощь, но я нашел ОТЛИЧНУЮ функцию для моей цели FloodFill!


Для твоих целей, может и подходит, а по жизни - штука медленная.

249
02 июня 2005 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by Freeman
Для твоих целей, может и подходит, а по жизни - штука медленная.


Да, я уже это понял! После закраски более 10 6тиугольников, прога загибается (условно говоря)...
Пробовал с полигонами - работает значительно быстрее. Спасибо за совет.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог