Среда программирования:
Eclipse
Статья по теме:
Данная программа рисует кривую Минковского.
Алгоритм:
На вход функции отрисовки drawMinkovskyCurve получает параметры, определяющие местоположение двух начальных точек и количество итераций. Далее если количество итераций равно 0, рисуем отрезок между этими точками. В ином случае определяем горизонтальный отрезок или вертикальный, далее заполняем массивы координат ломаной, после чего вызываем нашу функцию рекурсивно для каждого звена ломаной с количеством итераций на 1 меньше.
Примечание: я использовал именно этот алгоритм с целью избежания искажений, потому применим он лишь к отрезкам, параллельным одной из осей.
Код программы:
public static int drawMinkovskyCurve(Graphics g, int x1, int y1, int x2, int y2, int iter) { // (x1,y1) and (x2,y2) are the points, iter - // iteration number if (iter == 0) { g.drawLine(x1, y1, x2, y2); return 0; } int x[] = new int[9]; int y[] = new int[9]; x[0] = x1; y[0] = y1; x[8] = x2; y[8] = y2; int d; if (y1 == y2) { // draw horizontal curve d = (x2 - x1) / 4; x[1] = x[2] = x[0] + d; x[3] = x[4] = x[5] = x[2] + d; x[6] = x[7] = x[3] + d; y[1] = y[4] = y[7] = y[0]; y[2] = y[3] = y[0] - d; y[5] = y[6] = y[0] + d; } else { // draw vertical curve d = (y2 - y1) / 4; y[1] = y[2] = y[0] + d; y[3] = y[4] = y[5] = y[2] + d; y[6] = y[7] = y[3] + d; x[1] = x[4] = x[7] = x[0]; x[2] = x[3] = x[0] - d; x[5] = x[6] = x[0] + d; } for (int i = 0; i < 8; i++) { // recursive calls of drawing a curve drawMinkovskyCurve(g, x[i], y[i], x[i + 1], y[i + 1], iter - 1); } return 0; }
Прикрепленный файл | Размер |
---|---|
DrawMinkovskyCurve.zip | 6.02 кб |