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

Ваш аккаунт

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

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

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

Pomogite razobratysa

2.0K
10 декабря 2004 года
Dante™
28 / / 08.07.2003
Vsem Privet, esty takaya vot interesnaya shtuchka:
Na Forme esty canva, na kanve na kajdiy click mouse risuu lomanuu, toesty poluchaetysa tipa gravik lomannoy, mne nado povesity na knopku sobitie kotoroe budet: risovaty tuje lomanuu toesty kak bi zarisovivaty drugim cvetom k primeru, no zarisovivaty buet ne kuski lomannoy a kak bi rastet, kak budto bejit po krivoy. tipa s nachala lomanou bejit utolshenie vsey lomannoy, + eshe kakto bi zadavaty skorosty, tam uje s timer mutity nado. Help kak sdelaty, chtobi plavno havala?
THANKS
4
10 декабря 2004 года
mike
3.7K / / 01.10.2002
В чем проблема?

Запомниаешь координаты и время кликов в массив, а потом вспроизводишь с учетом задержек.
317
10 декабря 2004 года
Relax
573 / / 20.09.2000
Цитата:
Originally posted by Dante™
Vsem Privet, esty takaya vot interesnaya shtuchka:
Na Forme esty canva, na kanve na kajdiy click mouse risuu lomanuu, toesty poluchaetysa tipa gravik lomannoy, mne nado povesity na knopku sobitie kotoroe budet: risovaty tuje lomanuu toesty kak bi zarisovivaty drugim cvetom k primeru, no zarisovivaty buet ne kuski lomannoy a kak bi rastet, kak budto bejit po krivoy. tipa s nachala lomanou bejit utolshenie vsey lomannoy, + eshe kakto bi zadavaty skorosty, tam uje s timer mutity nado. Help kak sdelaty, chtobi plavno havala?
THANKS



если я правильно понял, тебе надо чтобы кривая отрисовывалась не только по отмеченным мышкой точкам, а чтобы каждый из отрезков кривой рос плавно... если так, то к тому что написал mike надо добавить еще расчет формулы линии и отрисовку по таймеру точек этой линии...
формула прямой линии (на всякий случай) y=kx+b. берешь известные точки отрезка, расчитываешь по ним коэффициенты k и b

2.0K
10 декабря 2004 года
Dante™
28 / / 08.07.2003
Цитата:
Originally posted by mike
В чем проблема?

Запомниаешь координаты и время кликов в массив, а потом вспроизводишь с учетом задержек.


Vot imenno rebyata, ya tak i delau, zapominay koordinati, no ne pol;uchaetsya vosproizvesti plavniy rost

krivoy....Podskajite PLS na primere..zaputalsya...

368
10 декабря 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Dante™

Vot imenno rebyata, ya tak i delau, zapominay koordinati, no ne pol;uchaetsya vosproizvesti plavniy rost

krivoy....Podskajite PLS na primere..zaputalsya...


Наверно нужна еще команда Repaint для формы, или для PaintBox, если на нем рисуешь.

И возможно вместо timer-а подойдет и Sleep.

317
10 декабря 2004 года
Relax
573 / / 20.09.2000
Цитата:
Originally posted by Dante™

Vot imenno rebyata, ya tak i delau, zapominay koordinati, no ne pol;uchaetsya vosproizvesti plavniy rost

krivoy....Podskajite PLS na primere..zaputalsya...



не получается что? плавный рост или вообще рост?

2.0K
10 декабря 2004 года
Dante™
28 / / 08.07.2003
Цитата:
Originally posted by Relax


не получается что? плавный рост или вообще рост?


Плавный рост не получается, не знаю как это сделать и с помощью чего лучше. Я пытался сделать рост так: в таймер кидал LineTo(kor_x,kor_y)
gde kor_x и kor_y(так чтобы линия росла до kor_x и kor_y) , это координаты самой кривой, которую я нашелкал мышкой на канве.

317
10 декабря 2004 года
Relax
573 / / 20.09.2000
опять недоговорил! чем все это закончилось? что произошло? сразу вся нарисовалась? или что?
368
10 декабря 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Relax
опять недоговорил! чем все это закончилось? что произошло? сразу вся нарисовалась? или что?


Совет на счет Repaint беру обратно.

Проверил...Рисовал на форму, на paintbox, с таймером и c Sleep(). Рисуется плавно и без Repaint. :)

Может нет первоначального MoveTo?
Или Interval у таймера черезчур маленький.

2.0K
10 декабря 2004 года
Dante™
28 / / 08.07.2003
Цитата:
Originally posted by Relax
опять недоговорил! чем все это закончилось? что произошло? сразу вся нарисовалась? или что?


Посмотрите BMP

2.0K
11 декабря 2004 года
Dante™
28 / / 08.07.2003
Цитата:
Originally posted by rostyslav
Основная разница между timer и Sleep(), что Sleep() проще.

LineTo(x,y);
Sleep(300); // задержка на 0,3 сек.

Чтоб рисовалась плавно, нужно как советовал Relax:
y = kx+b; (еще возможны 2 варианта y = a, и x = b.)

Расчитать для каждой ломанной k и b, и выводить напр. с шагом ширины пера.

Проще всего и красивее всего было бы, если бы перо второй линии тоже бы имел ширину 1 пиксел.

Тогда первая точка известна, можно сразу вывести красный пиксел Canvas->Pixels[x0][yo] = clRed;

после этого прощупать (:D) соседние пикселы к (x0,y0) и черный заменить на красный итд.

Если есть несколько кандидатов для закраски, то нужно закрасить тот который ближе к вершине ломанной. Расстояние вроде вычисляется по формуле
sqrt((x2-x1)**2+(y2-y1)**2)




OK, я согласен , что Sleep() проще.Но как именно рассчитать по формуле, еще лучше как с ней создать плавный рост? Кусочек примера ПЛЗ, а то я уже "утонул":devil:

368
11 декабря 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Dante™

OK, я согласен , что Sleep() проще.Но как именно рассчитать по формуле, еще лучше как с ней создать плавный рост? Кусочек примера ПЛЗ, а то я уже "утонул":devil:


Допустим вершины ломанной записаны в вектор
vector<TPoint>points;
тогда

Код:
#define STEP 3
TPoint t0 = points[0];
Canvas->Pen->Color=clRed;
Canvas->MoveTo(t0.x, t0.y);
for(int i=1;i<points.size();i++)
{
  TPoint t1 = points;
  int x = t0.x;
  int y = t0.y;
  int step;
  // здесь возможны 3 варианта
  if(t0.x==t1.x) // первый вариант (x=a)
  {
    if(t0.y<t1.y)
      step = STEP;
    else
      step = -STEP;
    for(y+=step;;y+=step)
    {
      if(step<0)
      {
        if(y<t1.y)y=t1.y;
      }
      else
      {
        if(y>t1.y)y=t1.y;
      }
      Canvas->LineTo(x, y);
      Sleep(100);
      if(y==t1.y)break;
    }
  }
  else  if(t0.y==t1.y) // второй вариант (y=b)
  {
    if(t0.x<t1.x)
      step = STEP;
    else
      step = -STEP;
    for(x+=step;;x+=step)
    {
      if(step<0)
      {
        if(x<t1.x)x=t1.x;
      }
      else
      {
        if(x>t1.x)x=t1.x;
      }
      Canvas->LineTo(x, y);
      Sleep(100);
      if(x==t1.x)break;
    }
  }
  else // третий вариант y=kx+b
  {
    // не помню, как вычисляется k и b
    // нужно бы посмотреть в книге по аналит.геом.
  }
  t0 = t1;
}
Можно проверить. Напр.
 
Код:
points.push_back(TPoint(10,10));
points.push_back(TPoint(10,100));
points.push_back(TPoint(100,100));
points.push_back(TPoint(100,10));
points.push_back(TPoint(10,10));

Canvas->MoveTo(10,10);
for(int i=1;i<5;i++)Canvas->LineTo(points.x,points.y);
И после этого вызвать первую процедуру. Я проверил. Вроде работает нормально.
2.0K
11 декабря 2004 года
Dante™
28 / / 08.07.2003
Супер, огромное спасибо!!!8) Как все сделаю, дам знать как работает!!!
2.0K
11 декабря 2004 года
Dante™
28 / / 08.07.2003
Я чето не очень пойму код, к примеру,
1)TPoint t0 = points[0] - создает точку начала
координат?
2)for(int i=1;i<points.size();i++) point.sizee()??


TPoint t1 = points;????????????
int x = t0.x; записывает координаты начала 0,0
int y = t0.y;
int step; шаг роста

Если можна, поясни ПЛЗ, а то запутался в t0 и t1
2.0K
11 декабря 2004 года
Dante™
28 / / 08.07.2003
Если можешь, пошагово обьясни...:???:
368
11 декабря 2004 года
rostyslav
629 / / 13.07.2004
// TPoint t0 = points[0] - создает точку начала
координат?

Нет. Это пример для проверки. Рисуется квадрат. Это первая вершина квадрата. В твоей проге она наверно должна задавать начало координат.

//for(int i=1;i<points.size();i++) point.sizee()??
size() - это размерность вектора. К .h файлу нужно будет еще подключть файл <vector.>


// TPoint t1 = points;????????????
Следующая вершина ломанной.

// int x = t0.x; int y = t0.y;
Текущая вершина ломанной. Идем от t0 к t1.

// int step; шаг роста
На step pixel-ов меняем координату x или y. Может быть отрицательным и положительным.

Тебе только нужно закодировать расчет k и b. И третий вариант. Наверно после расчета нужно умножить k и b на 10000 и перевести в int. А потом результат k*x+b делить на 10000.

На всякий случай приложил модуль.
2.0K
11 декабря 2004 года
Dante™
28 / / 08.07.2003
Тогда кривая будет рисоваться с t0.x=0 t0.y=0, потом, как я понял Size() проверяет количесвто вершин в кривой. В t1 у меня висят вершины, которые перебираются в цикле.Затем идет 1 условие, вот я не очень понимаю его наполнение - объясни ПЛЗ.
368
11 декабря 2004 года
rostyslav
629 / / 13.07.2004
первый вариант. текущая ломанная перпендикулярна оси X. Меняется только y.

y может или увеличиваться или уменьшаться.
Поэтому сперва опредляется знак шага(step);

Потом идет цикл. y+=step.

но нужно проверить, что y не стал ли больше/меньше от t1.y.

выводится часть линии.

задержка на 0.1 сек.

и если достигли t1.y то выход из внутреннего цикла.

В конце основного цикла меняем t0 на t1.
2.0K
11 декабря 2004 года
Dante™
28 / / 08.07.2003
Ага, теперь понял, условие t0.x==t1x и t0.y==t1.y
ето условие перпендикулярности и параллельности отрезка ломанной. А вот обязательно ли третий вариант y=kx+b?
368
11 декабря 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by Dante™
Ага, теперь понял, условие t0.x==t1x и t0.y==t1.y
ето условие перпендикулярности и параллельности отрезка ломанной. А вот обязательно ли третий вариант y=kx+b?


Не знаю. Эту задачу не преподаватель поставил?

2.0K
11 декабря 2004 года
Dante™
28 / / 08.07.2003
Цитата:
Originally posted by rostyslav

Не знаю. Эту задачу не преподаватель поставил?


Хуже, доцент.

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