Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите решить задачку !!!!!! Задача в Делфи 7 по графике 
:(
    Опции темы
Desha
Дата 4.4.2005, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В PaintBox случайно выбираются 2 точки. Соединить эти 2 точки случайной ломанной линией, строящейся по следующему принципу: начинаем движение от первой точки, а затем на каждом шаге делаем следующее: сначала выбираем длину звена (от 1 до 10 пикселей), а затем направление движения (вверх, вниз, вправо, влево), причем шансы пойти в сторону второй точки несколько больше, чем от нее. Процесс продолжать, пока не достигнем второй точки.


Буду очень благодарна !!! Извините если не в той рубрике smile
PM MAIL   Вверх
Albinos_x
Дата 4.4.2005, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



А по диагонали она может двигаться?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Desha
Дата 5.4.2005, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



не, походу токо вниз вверх, влево вправо
PM MAIL   Вверх
Poseidon
Дата 5.4.2005, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Цитата(Desha @ 4.4.2005, 19:59)
Извините если не в той рубрике
Не в той! Но это уже больше к модераторам относится! Помогаем решить не здесь.

К какому дню нужно? Сделаем!

Добавлено @ 01:45
Да, и уточни:

Цитата(Desha @ 4.4.2005, 19:59)
выбираем длину звена
Выбираем мы (пользователь) или программа?



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Desha
Дата 5.4.2005, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Выбирает программа . Надо к четвергу smile Заранее спасибо smile
PM MAIL   Вверх
Albinos_x
Дата 5.4.2005, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



А вероятность задаётся пользователем или программой?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Desha
Дата 6.4.2005, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Программой, функцией Random походу smile
PM MAIL   Вверх
Poseidon
Дата 6.4.2005, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Значит так! Я тут посидел немного (все ради дамы!) и вот что у меня получилось.
Скажу сразу, с компонентом PaintBox работаю впервые, так что если что, то не обессудьте. Но код рабочий.
На форме:
PaintBox,
Button1 (для начала рисования),
Button2 (для досрочного прекращения);

Вот код:
Код
Unit 1

...

var
  Form1: TForm1;
  stop: boolean; // нужно именно здесь объявить эту переменную

...

procedure TForm1.Button1Click(Sender: TObject);
const
  chance = 3; //шанс пойти в сторону второй точки
  speed = 50; // скорость рисовения в миллисекундах
var
x,y: Integer; //координаты точки, гда мы находимся
x1,y1, x2,y2: integer; // случайные точки
PaintX, PaintY: integer; // размер PaintBox
WidthLine: integer; // длинна звена
a,b: integer; // переменные, определяющие направление
begin
PaintX:= PaintBox.Width;
PaintY:= PaintBox.Height;
stop:= false;
Randomize;

// определяем случайные точки
x1:= Random(PaintX);
x2:= Random(PaintX);
y1:= Random(PaintY);
y2:= Random(PaintY);


// нарисуем вторую точку
PaintBox.Canvas.MoveTo(x2,y2);
PaintBox.Canvas.LineTo(x2+1,y2+1);

// начинаем движение от первой точки
PaintBox.Canvas.MoveTo(x1,y1);
x:= x1;
y:= y1;


// рисуем
repeat
  { определяем направление движения
  если а = 0, b = 1, то по вертикали, иначе по горизонтали}
  a:= Random(2);
  if a = 0 then b:=1 else b:= 0; // исключаем возможность движения по диагонали

  WidthLine:= Random(10)+1; // длинна звена от 1 до 10 пикселей

  // делаем шансы пойти в сторону второй точки несколько больше, чем от нее
  if ((b <> 0)and(abs(y2-(y+b*WidthLine)) > abs(y2-(y-b*WidthLine))))
  or ((a <> 0)and(abs(x2-(x+a*WidthLine)) > abs(x2-(x-a*WidthLine))))
  then // если мы отдаляемся от второй точки, то
  if random(chance) <> 0 then begin a:= -a; b:= -b; end;

  // не даем нашей кривой выйти за границы PaintBox
  if (x+a*WidthLine > PaintX)or(y+b*WidthLine > PaintY)
  then begin a:=-a; b:=-b end;

  // рисуем кривую
  PaintBox.Canvas.LineTo(x+a*WidthLine,y+b*WidthLine);
  x:= x + a*WidthLine;
  y:= y + b*WidthLine;

  Application.ProcessMessages; // даем поработать другим
  sleep(speed); // остановимся не на долго

  if stop then exit; //если нажали кнопку остановиться, то остановимся

until (x = x2)and(y = y2); // достигли второй точки

ShowMessage('Дошли до второй точки!');

end;

procedure TForm1.Button2Click(Sender: TObject); // нажали кнопку остановиться
begin
stop:= true;
end;

end.


В общем все. Писал все с обьяснениями, но если будут вопросы по реализации, тапа "а это зачем?" или еще какие, то задавай, всегда буду рад ответить.

PS. Сегодня среда, надеюсь успел!


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Desha
Дата 6.4.2005, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Poseidon !!!!! Спасибо тебе огромное !!!!! За проделанную работу !!!! Ты просто чудо smile Спасибо Спасибо Спасибо СпасибоСпасибо СпасибоСпасибо СпасибоСпасибо СпасибоСпасибо СпасибоСпасибо СпасибоСпасибо СпасибоСпасибо СпасибоСпасибо СпасибоСпасибо Спасибо smile
PM MAIL   Вверх
Poseidon
Дата 6.4.2005, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Всегда рад помочь. Заходи к нам еще. smile


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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