IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> вращение диска
Sensitive
сообщение 2.06.2007 13:32
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 132
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


Вообще не знаю каким способом делать эту задачу.
Условие прилагается. Подскажите пожалуйста, как это всё реализовать.


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
Ответов(1 - 19)
volvo
сообщение 2.06.2007 18:11
Сообщение #2


Гость






Если на диске должен быть только черный и белый сегмент (просто на картинке ж ничего не разобрать, поэтому уточняю), то все довольно просто: тебе понадобится только хранить углы начала/конца одного из сегментов, из этих данных элементарно находится, где начинается/заканчивается второй сегмент... Отрисовывать эти сегменты можно через Sector, а можно - PieSlice (еще один вариант - Arc + 2 линии)... При повороте просто увеличивать (или уменьшать, в зависимости от направления вращения) значения хранимых углов на определенное значение, которое будет тем больше, чем больше скорость...

А вот есть на диске есть еще что-то, кроме собственно линии разделения сегментов, то придется осуществлять поворот всего изображения (как-то делал, попробую найти ссылку, если надо, потому что делал для другого форума, не здесь...), но это чревато сильными тормозами, которые будут увеличиваться при увеличении размеров изображения.
 К началу страницы 
+ Ответить 
Sensitive
сообщение 2.06.2007 18:28
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 132
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


Да,на диске на белой его части есть частички (чёрные). Сам диск (если он черно-белый,то нарисовать не проблема(уже сделала),а вот эти кусочки не знаю как сделать(постараюсь сделать)). Если можно, то поищи где ты делал поворот всего изображения, потому что я не могу понять пока что как сделать. А там, если подскажешь, то думаю разберусь(надеюсь).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 2.06.2007 19:03
Сообщение #4


Гость






Несколько способов есть здесь (перевести то, что там реализовано с Дельфи на Паскаль не составит труда):

Drkb -> Работа с графикой и мультимедиа -> Графические фильтры и эффекты -> Вращение, зеркальные преобразования

(свою ссылку пока не нашел. Найду - выложу)
 К началу страницы 
+ Ответить 
klem4
сообщение 2.06.2007 20:39
Сообщение #5


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Цитата
тебе понадобится только хранить углы начала/конца одного из сегментов, из этих данных элементарно находится, где начинается/заканчивается второй сегмент... Отрисовывать эти сегменты можно через Sector, а можно - PieSlice (еще один вариант - Arc + 2 линии)..


Помоему будет достаточно одного угла, второй то будет = первый + 180* ?

Я вот тоже так пробовал, Sector + FillEllipse или Sector + Sector. Получается достаточно глючно (мерцание при маленькой задержке) smile.gif) Может что-то я не верно конечно делаю.

Volvo ты пробовал ?

Есть мысль не полностью сектора заливать, а сначала отрисовать окружность, на половину белую на половину черную, а потом, в цикле, перекрашивать FloodFill'ом маленкие кусочки, на которые будет осуществляться сдвиг прямой, делящей окружность на 2 половины.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 2.06.2007 20:47
Сообщение #6


Гость






Цитата
Помоему будет достаточно одного угла, второй то будет = первый + 180* ?
Если диск разделен по диаметру, то хватит и одного...

Цитата
Получается достаточно глючно (мерцание при маленькой задержке)
Исходник можно посмотреть?

Я, кстати, если не надо было бы отрисовывать вот это:
Цитата
на белой его части есть частички (чёрные).
, сделал бы совсем по-другому: просто разбил бы окружность, скажем, на 32 (можно и побольше) равных сектора, залил половину белым цветом, половину - черным, и поочередно "гасил" (сбрасывал в черный) один граничный сектор/"зажигал" противоположный.... Секторы маленькие, тормозов никаких...
 К началу страницы 
+ Ответить 
Sensitive
сообщение 2.06.2007 20:49
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 132
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


volvo, если можешь дай полную ссылку. Не смогла найти, где там есть эти варианты.sad.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 2.06.2007 20:55
Сообщение #8


Гость






Sensitive, я же дал полный путь к статьям blink.gif

Первая и вторая статьи в указанной папке полностью посвящены вращению изображений...
 К началу страницы 
+ Ответить 
klem4
сообщение 2.06.2007 20:56
Сообщение #9


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Вроде этого

cx := GetMaxX div 2;
cy := GetMaxY div 2;

angle := 180;

readkey;

while (angle >= 0) do begin

SetFillStyle(SolidFill, Black);

FillEllipse(cx, cy, r, r);

SetFillStyle(SolidFill, White);
Sector(cx, cy, angle, angle + 180, r, r);

delay(100);

angle := angle - 1;
end;


Цитата
сделал бы совсем по-другому:


Вот это кстати интересно. Думаю так и стоит сделать.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Sensitive
сообщение 2.06.2007 21:28
Сообщение #10


Пионер
**

Группа: Пользователи
Сообщений: 132
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


Ой,сорри,volvo, всё нашла. Сейчас буду разбираться.Спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 2.06.2007 21:57
Сообщение #11


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


В общем вот черновой вариант, есть небольшие нестыковочки, но работает намного быстрее.

uses crt, graph;

const
r = 100;

cx: Integer = 0;
cy: Integer = 0;

var
gd, gm: Integer;

angle, T, CA, CB: Integer;

ch: Char;

begin
gd := detect;
initgraph(gd, gm, '');

cx := GetMaxX div 2;
cy := GetMaxY div 2;

angle := 180;

CA := White;
CB := Black;

SetFillStyle(SolidFill, CA);
Sector(cx, cy, 0, 180, r, r);
SetFillStyle(SolidFill, CB);
Sector(cx, cy, 180, 360, r, r);

repeat
ch := #0;
angle := 0;

while (ch = #0) and (angle < 180) do begin
SetColor(CB);
SetFillStyle(SolidFill, CB);
Sector(cx, cy, angle, angle + 12, r, r);

SetColor(white);
Circle(cx, cy, r);

SetColor(CA);
SetFillStyle(SolidFill, CA);
Sector(cx, cy, angle + 180, angle + 192 , r, r);

inc(angle, 12);
while keypressed do ch := readkey;

delay(50);
end;

T := CA; CA := CB; CB := T;

until ch <> #0;

closegraph;
end.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Sensitive
сообщение 4.06.2007 16:30
Сообщение #12


Пионер
**

Группа: Пользователи
Сообщений: 132
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


К моему сожалению не смогла разобраться в тех примерах, котрые вы давали на Делфи... но всё равно спасибо за старание всем.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Sensitive
сообщение 4.06.2007 16:33
Сообщение #13


Пионер
**

Группа: Пользователи
Сообщений: 132
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


к моему сожалению не смогла разобраться в тех примера,что вы давали на Делфи,но все равно всем большое спасибо за старание.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Sensitive
сообщение 5.06.2007 18:04
Сообщение #14


Пионер
**

Группа: Пользователи
Сообщений: 132
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


Я прошу прощения еще раз...
при повороте изображения какие нужно изменять параметры?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 5.06.2007 18:08
Сообщение #15


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


В твоем конкретном случае, при использовании предложенной тут реализации, изменяется угол под которым проходит прямая, делящая окружность на 2 части.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Sensitive
сообщение 6.06.2007 18:54
Сообщение #16


Пионер
**

Группа: Пользователи
Сообщений: 132
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


всё сижу над этим диском...
вот подпрограмма,которая рисует диск,но мне нужен такой же,только чтоб "дуги" чёрные на белом фоне были какбы отрзеркалины...то есть были не в правой части диска,а в левой...так как на рисунке... помогите переделать подпрограмму...

procedure   disk(f:real;   r:integer) ; 
var r2:integer;
begin
r2:=r+1;
arc(0,0,round(180+180*f/pi)-1,round(360+180*f/pi)+1,r);
arc(0,0,round(180*f/pi-1),round(46+180*f/pi),r-5);
arc(0,0,round(180*f/pi-1),round(46+180*f/pi),r-11);
arc(0,0,round(44+180*f/pi),round(91+180*f/pi),r-16);
arc(0,0,round(44+180*f/pi),round(91+180*f/pi),r-22);
arc(0,0,round(89+180*f/pi),round(136+180*f/pi),r-27);
arc(0,0,round(89+180*f/pi),round(136+180*f/pi),r-33);
arc(0,0,round(134+180*f/pi),round(181+180*f/pi),r-38);
arc(0,0,round(134+180*f/pi),round(181+180*f/pi),r-44);
line(round(r2*cos(pi+f)),-round(r*sin(pi+f)),round(r*cos(2*pi+f)),-round(r*sin(2*pi+f)));
line(round((r-4)*cos(pi/4+f)),-round((r-4)*sin(pi/4+f)),round((r-11)*cos(pi/4+f)),-round((r-11)*sin(pi/4+f)));
line(round((r-16)*cos(pi/4+f)),-round((r-16)*sin(pi/4+f)),round((r-22)*cos(pi/4+f)),-round((r-22)*sin(pi/4+f)));
line(round((r-16)*cos(pi/2+f)),-round((r-16)*sin(pi/2+f)),round((r-22)*cos(pi/2+f)),-round((r-22)*sin(pi/2+f)));
line(round((r-27)*cos(pi/2+f)),-round((r-27)*sin(pi/2+f)),round((r-33)*cos(pi/2+f)),-round((r-33)*sin(pi/2+f)));
line(round((r-27)*cos(3*pi/4+f)),-round((r-27)*sin(3*pi/4+f)),round((r-33)*cos(3*pi/4+f)),-round((r-33)*sin(3*pi/4+f)));
line(round((r-38)*cos(3*pi/4+f)),-round((r-38)*sin(3*pi/4+f)),round((r-44)*cos(3*pi/4+f)),-round((r-44)*sin(3*pi/4+f)));
setfillstyle(1,1);
floodfill(round(r/2*cos(3*pi/2+f)),-round(r/2*sin(3*pi/2+f)),1);
floodfill(round((r-8)*cos(pi/6+f)),-round((r-8)*sin(pi/6+f)),1);
floodfill(round((r-20)*cos(pi/3+f)),-round((r-20)*sin(pi/3+f)),1);
floodfill(round((r-30)*cos(2*pi/3+f)),-round((r-30)*sin(2*pi/3+f)),1);
floodfill(round((r-40)*cos(5*pi/6+f)),-round((r-40)*sin(5*pi/6+f)),1);
end;



Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 6.06.2007 20:29
Сообщение #17


Гость






Зачем тебе вручную рассчитывать все координаты, когда это за тебя может сделать Паскаль?

Запусти вот это, к примеру:
uses graph;

procedure disk(f: real; r:integer);

const delta = 6;
procedure put_arc(start, finish: integer;
var r_out: integer);
var
xs_in, ys_in, xf_in, yf_in: integer;
arc_coords: arccoordstype;
begin
arc(0, 0, round(start + f),round(finish + f), r_out);
getarccoords(arc_coords);
with arc_coords do begin
xs_in := xstart; ys_in := ystart;
xf_in := xend; yf_in := yend;
end;

dec(r_out, delta);

arc(0, 0, round(start + f), round(finish + f), r_out);
getarccoords(arc_coords);
with arc_coords do begin
line(xs_in, ys_in, xstart, ystart);
line(xf_in, yf_in, xend, yend);
end;
end;

begin
arc(0,0,round(180+180*f/pi)-1,round(360+180*f/pi)+1,r);

dec(r, 16);
put_arc(135, 180, r);
put_arc(90, 135, r);
put_arc(45, 90, r);
put_arc(0, 45, r);
end;

var gd, gm: integer;

begin
initgraph(gd, gm, '');
setviewport(getmaxx div 2, getmaxy div 2, getmaxx, getmaxy, false);
disk(0, 50);
readln;
closegraph;
end.

 К началу страницы 
+ Ответить 
Sensitive
сообщение 6.06.2007 23:32
Сообщение #18


Пионер
**

Группа: Пользователи
Сообщений: 132
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


да,действительно и без ручного расчета тот код,что ты дал работает верно. Но я теперь не могу понять,как теперь остаток программы переделать. У меня всё получается делается для рисунка,если черные линиии справа...не могу понять что нужно изменить...или всё переделать надо?

uses   graph,crt; 
const r = 100; d = 9000 ; df = pi/50;
var f:real; i , k:integer ;
Procedure disk(f:real;r:integer); {ваша процедура}
const delta=6;
procedure put_arc(start,finish:integer; var r_out:integer);
var xs_in,ys_in,xf_in,yf_in,r2:integer;
arc_coords:arccoordstype;
begin
r2:=r+1;
arc(0,0,round(start+f),round(finish+f),r_out);
getarccoords(arc_coords);
with arc_coords do begin
xs_in:=xstart;ys_in:=ystart;
xf_in:=xend;yf_in:=yend;
end;
dec(r_out,delta);
arc(0,0,round(start+f),round(finish+f),r_out);
getarccoords(arc_coords);
with arc_coords do begin
line(xs_in,ys_in,xstart,ystart);
line(xf_in,yf_in,xend,yend);
end;
end;
begin
arc(0,0,round(180+180*f/pi)-1,round(360+180*f/pi)+1,r);
dec(r,16);
put_arc(135,180,r);
put_arc(90,135,r);
put_arc(45,90,r);
put_arc(0,45,r);
end;

begin
init;{инициализация граф режима}
setbkcolor(15);
setpalette(1,0);
setviewport(getmaxx div 2,getmaxy div 2,getmaxx,getmaxy,false);
f:=2*pi;
k:=1;
i:=0;
repeat
if (i=100) or (i=-100) then begin f:=2*pi; i:=0 end;
setcolor(1);
disk(f,r); {изменила параметры}
delay(d);
setcolor(15);
setfillstyle(1,15);
fillellipse(0,0,r+1,r+1);
if keypressed then
if readkey=#0 then
case ord(readkey) of
59: k:=-1;
68: k:=1;
79: halt;
end;
i:=i+k;
f:=f+df*k;
until false;
end.


P.S. Не знаю как сделать правильно движение это...подскажите, как сделать правильно поворот?

Сообщение отредактировано: Sensitive - 7.06.2007 15:29
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Sensitive
сообщение 9.06.2007 13:32
Сообщение #19


Пионер
**

Группа: Пользователи
Сообщений: 132
Пол: Женский
Реальное имя: Юлия

Репутация: -  0  +


С диском так и "воюю"...
как закрасить диск,если программа выглядит таким образом:

uses   graph,crt; 
const r = 100; d = 9000 ; df = pi/50;
var f:real; i , k:integer ;
begin
init;
setbkcolor(15);
setpalette(1,0);
setviewport(getmaxx div 2,getmaxy div 2,getmaxx,getmaxy,false);
f:=2*pi;
k:=1;
i:=0;
repeat
if (i=100) or (i=-100) then begin f:=2*pi; i:=0 end;
setcolor(1);
disk(f,r);
delay(8000);
setcolor(15);
setfillstyle(1,15);
fillellipse(0,0,r+1,r+1);
if keypressed then
if readkey=#0 then
case ord(readkey) of
59: k:=-1;
68: k:=1;
79: halt;
end;
i:=i+k;
f:=f+df*60*k;
until false;
end.


И в чём ошибка: почему "еллипс"(точнее его часть) вращается намного быстрее,чем дуги... blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.06.2007 14:10
Сообщение #20


Гость






Вот так вращается одинаково:
uses graph, crt;

procedure disk(f: real; r:integer);

const delta = 6;
procedure put_arc(start, finish: integer;
var r_out: integer);
var
xs_in, ys_in, xf_in, yf_in: integer;
arc_coords: arccoordstype;
begin
arc(0, 0, round(start + f),round(finish + f), r_out);
getarccoords(arc_coords);
with arc_coords do begin
xs_in := xstart; ys_in := ystart;
xf_in := xend; yf_in := yend;
end;

dec(r_out, delta);

arc(0, 0, round(start + f), round(finish + f), r_out);
getarccoords(arc_coords);
with arc_coords do begin
line(xs_in, ys_in, xstart, ystart);
line(xf_in, yf_in, xend, yend);
end;
end;

begin
setfillstyle(solidfill, white);
circle(0, 0, r);
line(
trunc(r*cos(f*pi/180)), trunc(-r*sin(f*pi/180)),
trunc(r*cos((180+f)*pi/180)), trunc(-r*sin((180+f)*pi/180))
);

floodfill(
trunc((r/2)*cos((trunc(f+270) mod 360)*pi/180)),
trunc(-(r/2)*sin((trunc(f+270) mod 360)*pi/180)),
white
);

dec(r, 16);
put_arc(135, 180, r);
put_arc(90, 135, r);
put_arc(45, 90, r);
put_arc(0, 45, r);
end;

var
gd, gm: integer;
i: integer;

begin
initgraph(gd, gm, '');
setviewport(getmaxx div 2, getmaxy div 2, getmaxx, getmaxy, false);
for i := 0 to 120 do begin
cleardevice;
disk(i, 50);
delay(1575);

end;
readln;
closegraph;
end.

 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.06.2025 15:59
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"