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

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

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

> вращение диска
сообщение
Сообщение #1


Пионер
**

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

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


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


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


Гость






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

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


Пионер
**

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

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


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


Гость






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

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

(свою ссылку пока не нашел. Найду - выложу)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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

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

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


Пионер
**

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

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


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


Гость






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

Первая и вторая статьи в указанной папке полностью посвящены вращению изображений...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Пионер
**

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

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


Ой,сорри,volvo, всё нашла. Сейчас буду разбираться.Спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Пионер
**

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

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


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


Пионер
**

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

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


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


Пионер
**

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

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


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


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

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

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


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


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

 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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

 





- Текстовая версия 26.11.2020 5:57
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name