1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Сейчас стараюсь решить задачку в графике, однако возникло масса проблем с кодингом. Условие следующее:
Я представил эту ситуацию так: Каждая сторона имеет свой номер(чтобы было проще соориентироваться, при отрисовке линий). Проблемы которые возникли: 1) Отрисовка этих линий в одном треугольнике (начинаем с треугольника FOA) 2) "Отзеркаливание" этих линий, вместо того, чтобы рисовать их с нуля. (в нашем примере, нарисовав линии в треугольнике FOA, рисуем зеркально линии в OAB, относительно OA; после этого, опять зеркально рисуем для треугольника BOC, относительно BO).
Для отрисовки линий, пока трудно представляю как выбрать некоторые "случайные" координаты для первой точки линии на одной стороне, а после, взять другие "случайные" на одной из двух других. Пока что пришло на ум, через case как-то выделять эти стороны, обращение к ним, если одна из них выбрана. С отзеркаливанием линий, это по-мойму самая сложная часть, поскольку возникают вопросы: а) как указать программе, какую взяли линии за "ось симметрии" б) рисовать относительно нее линии
Исходный код, того, чего я смог пока сделать(Показать/Скрыть)
Uses Crt, Dos, Graph;
Type CoordsXY=array [1..7] of PointType; {Массив для хранения координат вершин шестиугольника} CoordsTr=array [1..3] of PointType; {Массив для хранения координат вершин треугольника}
Var center: PointType; {Центр шестиугольника} top : CoordsXY; {Координаты вершин шестиугольника} tr : CoordsTr; {Координаты вершин треугольника} i : integer; {Счетчик для циклов} R : integer; {Радиус} LineN : integer; {Количество линий, отрисованных в КАЖДОМ треугольнике} N : integer; {Максимальное количество случайный линий в треугольнике} x1,y1 : real; {Координаты начальной точки линии} x2,y2 : real; {Координаты конечной точки линии}
{Инициализация графики} Procedure Init; var Driver, Mode, ErrorCode: smallint; begin Driver:=detect; InitGraph(Driver,Mode,''); ErrorCode:=GraphResult; if ErrorCode<>grOK then begin Writeln(GraphErrorMsg(ErrorCode)); Halt(1); end; end;
{Ввод с клавиатуры ряда параметров} Procedure EnterParametrs; Begin clrscr; write('Введите радиус: '); readln®; writeln; write('Максимальное кол-во линий в треугольнике: '); readln(N); End;
{Отрисовка шестиугольника} Procedure DrawHexagon; Begin {Сначала найдем центр рабочей области} center.X:=GetMaxX div 2; center.Y:=GetMaxY div 2; {Потом определяем вершины шестиугольника} for i:=1 to 6 do begin top[i].X:=center.X+trunc(R*cos(((60*pred(i)+90)mod 360)*pi/180)); top[i].Y:=center.Y-trunc(R*sin(((60*pred(i)+90)mod 360)*pi/180)); end; top[7]:=top[1]; {Рисуем сам шестиугольник} setcolor(random(14)+1); for i:=1 to 6 do begin {вершина треугольника(центр шестиугольника)} tr[1]:=center; {вторая вершина} tr[2]:=top[i]; {третья вершина} tr[3]:=top[i+1]; {заливка треугольников цветом и их отрисовка} setfillstyle(solidfill,random(14)+1); fillpoly(3,tr); end; End;
{Поиск начальной координаты линии} Procedure FindXYStart(a,b:real); Begin End;
{Поиск конечной координаты линии} Procedure FindXYEnd(a,b:real); Begin end;
{Отрисовка N линий в треугольнике} Procedure DrawLines; Begin LineN:=random(N)+1; for i:=1 to lineN do begin x1:=0; y1:=0; x2:=0; y2:=0; FindXY(x1,y1); FindXY(x2,y2); SetColor(Blink); Line(x1,y1,x2,y2); end; End;
Begin {Вводим параметры с клавиатуры} EnterParametrs; {Запускаем графический режим и работаем с ним} Init; DrawHexagon; DrawLines; {После работы графического режима, отключаем его} readkey; CloseGraph; End.
Относительно отзеркаливания, пришла в голову идея, что, после того, как в одном треугольнике нарисуем все нужные линии, запишем в массивы их координаты (начало и конец соответственно), после чего нужно будет только изменить их координаты, путем поворота на 60 градусов по часовой/против часовой стрелки. Еще, не знаю, возможно, что через линейное преобразование можно сделать, но не уверен в результате...
Правда, пока не очень удачно получается взять координаты начала и конца точек, чтобы нарисовать все эти линии...
Исходный код:
{Поиск начальной координаты линии} Procedure FindXYStart; Var buf: integer; Begin side:=random(3)+1; case side of 1: begin buf:=top[1].X-center.X; x1:=top[1].X-random(buf)+1; buf:=center.Y-top[1].Y; y1:=center.Y-random(buf)+1; end; 2: begin buf:=abs(top[1].X-top[2].X); x1:=top[1].X-random(buf)+1; buf:=abs(top[1].Y); y1:=buf; end; 3: begin buf:=center.X-top[2].X; x1:=center.X-random(buf)+1; buf:=center.Y-top[2].Y; y1:=center.Y-random(buf)+1; end; end; End;
{Поиск конечной координаты линии} Procedure FindXYEnd; Var asd: word; buf: integer; Begin case side of 1: begin repeat asd:=random(3)+1; until asd<>side; case asd of 2: begin buf:=abs(top[1].X-top[2].X); x2:=top[1].X-random(buf)+1; buf:=abs(top[1].Y); y2:=buf; end; 3: begin buf:=abs(center.X-top[2].X); x2:=center.X-random(buf)+1; buf:=abs(center.Y-top[2].Y); y2:=center.Y-random(buf)+1; end; end; end;
2: begin repeat asd:=random(3)+1; until asd<>side; case asd of 1: begin buf:=abs(top[1].X-center.X); x2:=top[1].X-random(buf)+1; buf:=abs(center.Y-top[1].Y); y2:=center.Y-random(buf)+1; end; 3: begin buf:=abs(center.X-top[2].X); x2:=center.X-random(buf)+1; buf:=abs(center.Y-top[2].Y); y2:=center.Y-random(buf)+1; end; end; end;
3: begin repeat asd:=random(3)+1; until asd<>side; case asd of 1: begin buf:=abs(top[1].X-center.X); x2:=top[1].X-random(buf)+1; buf:=abs(center.Y-top[1].Y); y2:=center.Y-random(buf)+1; end; 2: begin buf:=abs(top[1].X-top[2].X); x2:=top[1].X-random(buf)+1; buf:=abs(top[1].Y); y2:=buf; end; end; end; end; End;