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 градусов по часовой/против часовой стрелки.
То есть, ты пришел к тому же, о чем я написал тебе во втором посте, но делаешь это пока сложным методом... Ничего, через пару дней тебе в голову придет идея, что можно не хранить координаты X, Y для начала/конца отрезка, а сделать что-то вроде:
type Position_Type = (Radial_Edge_Left, Radial_Edge_Right, Non_Radial_Edge); Polar_Point = record Position : Position_Type; Phi, R : Integer; end;
procedure Generate_Point(var Pnt : Polar_Point); begin Pnt.Position := Position_Type (Random (Ord (Non_Radial_Edge))); case Pnt.Position of Radial_Edge_Left : // Сгенерировать точку на "левой" радиальной стороне треугольника begin Pnt.Phi := 0; // Я принял отсчет угла от "левой" стороны, которая проходится // первой при обходе по часовой стрелке... Pnt.R := Random (Radius); end;
Radial_Edge_Right : // Сгенерировать точку на "правой" радиальной стороне begin Pnt.Phi := Angle; // 360 / количество сторон многоугольника Pnt.R := Random (Radius); end;
Non_Radial_Edge : // Сгенерировать точку на НЕрадиальной стороне begin Pnt.Phi := Random (Angle); Pnt.R := Trunc (Radius * Cos (To_Radians (Pnt.Phi))); end; end; end;
Тут же можно генерировать и вторую точку отрезка, только надо следить, чтобы их поля Position не были равны, иначе линия отрезок сольется с одной из сторон треугольника... Видишь, насколько все проще? Если подумать - то не надо будет даже ничего добавлять ни к чему для отзеркаливания: допустим, ты пронумеровал все треугольники от 1 до N, и сгенерировал несколько отрезков для треугольника №1. Тогда во все нечетные можно просто отображать те же отрезки, а в четные - поменяв Position с REL на RER, а для NRE - изменив угол с Phi на Angle - Phi... И всё, можно сразу всё отрисовать, буквально за 1 проход...