Pomogite razobratysa
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
Запомниаешь координаты и время кликов в массив, а потом вспроизводишь с учетом задержек.
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
В чем проблема?
Запомниаешь координаты и время кликов в массив, а потом вспроизводишь с учетом задержек.
Vot imenno rebyata, ya tak i delau, zapominay koordinati, no ne pol;uchaetsya vosproizvesti plavniy rost
krivoy....Podskajite PLS na primere..zaputalsya...
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.
Vot imenno rebyata, ya tak i delau, zapominay koordinati, no ne pol;uchaetsya vosproizvesti plavniy rost
krivoy....Podskajite PLS na primere..zaputalsya...
не получается что? плавный рост или вообще рост?
не получается что? плавный рост или вообще рост?
Плавный рост не получается, не знаю как это сделать и с помощью чего лучше. Я пытался сделать рост так: в таймер кидал LineTo(kor_x,kor_y)
gde kor_x и kor_y(так чтобы линия росла до kor_x и kor_y) , это координаты самой кривой, которую я нашелкал мышкой на канве.
опять недоговорил! чем все это закончилось? что произошло? сразу вся нарисовалась? или что?
Совет на счет Repaint беру обратно.
Проверил...Рисовал на форму, на paintbox, с таймером и c Sleep(). Рисуется плавно и без Repaint. :)
Может нет первоначального MoveTo?
Или Interval у таймера черезчур маленький.
опять недоговорил! чем все это закончилось? что произошло? сразу вся нарисовалась? или что?
Посмотрите BMP
Основная разница между 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:
OK, я согласен , что Sleep() проще.Но как именно рассчитать по формуле, еще лучше как с ней создать плавный рост? Кусочек примера ПЛЗ, а то я уже "утонул":devil:
Допустим вершины ломанной записаны в вектор
vector<TPoint>points;
тогда
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,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);
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
координат?
Нет. Это пример для проверки. Рисуется квадрат. Это первая вершина квадрата. В твоей проге она наверно должна задавать начало координат.
//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.
На всякий случай приложил модуль.
y может или увеличиваться или уменьшаться.
Поэтому сперва опредляется знак шага(step);
Потом идет цикл. y+=step.
но нужно проверить, что y не стал ли больше/меньше от t1.y.
выводится часть линии.
задержка на 0.1 сек.
и если достигли t1.y то выход из внутреннего цикла.
В конце основного цикла меняем t0 на t1.
ето условие перпендикулярности и параллельности отрезка ломанной. А вот обязательно ли третий вариант y=kx+b?
Ага, теперь понял, условие t0.x==t1x и t0.y==t1.y
ето условие перпендикулярности и параллельности отрезка ломанной. А вот обязательно ли третий вариант y=kx+b?
Не знаю. Эту задачу не преподаватель поставил?
Не знаю. Эту задачу не преподаватель поставил?
Хуже, доцент.