Рисование 3d сетей - архимедовых тел

12

У меня есть слабость к 3d сеткам, которые, будучи вырезанными и сложенными, позволяют вам делать 3d фигуры из бумаги или карты. Задача проста, написана самая короткая из возможных программ, которая рисует сети для 13 архимедовых тел. На выходе должен быть файл изображения в любом приемлемом формате (png, jpg).

Все тринадцать фигур описаны на http://en.wikipedia.org/wiki/Archimedean_solid и в следующей таблице, взятой оттуда.

введите описание изображения здесь

Входные данные: целое число от 1 до 13. Предположим, что фигуры пронумерованы точно так же, как в приведенной выше таблице, так что «усеченный тетраэдр» - это номер 1, а «додекаэдр» - это номер 13.

Вывод: файл изображения, содержащий сеть для этой фигуры. Просто контур, включая внутренние линии, в порядке. Нет необходимости заполнять его цветами

Вы можете использовать любой язык программирования, который вам нравится, а также любую библиотеку, которая не была создана специально для этого конкурса. Оба должны быть доступны бесплатно, однако (в обоих смыслах) онлайн.

Я приму ответ с наименьшим количеством символов ровно через неделю. Ответы будут приниматься всякий раз, когда они приходят.

(Нет) Победитель пока. К сожалению, нет действительных участников. Может быть, это слишком сложно?

Фелипа
источник
Может быть, покончить с ограничением по времени вообще? Что если кто-то найдет это через год. Вы хотите, чтобы они не пытались? ... Может быть, лучше сначала сделать платонический, подожди, а потом сложный. Возможно, вы поделили интерес. Лично для меня (все это экстраполяция), когда я увидел два похожих, я как бы отошел от этого, чувствуя, что у меня нет времени, чтобы по-настоящему взглянуть на оба вопроса и спланировать, как решить оба. И я не хотел бы делать это по-другому ... С другой стороны, у других здесь были проблемы с частью 2. См. Минский Регистр Машинных. Может быть, это не ты.
Люзер Дрог
@luserdroog Спасибо. Вопрос отредактирован. Возможно, мне следует добавить, что я отправил ответ на соответствующий вопрос по электронной почте многим людям, которые любят это! FWIW.
Фелипа
Я не думаю, что это сложно сделать , но для игры в гольф требуется несколько часов обдумывания и экспериментов, потому что для каждого многогранника есть много возможных сетей, и они не будут сжиматься одинаково хорошо.
Питер Тейлор

Ответы:

9

Ява, 1552

import java.awt.*;import java.awt.image.*;import java.io.*;import javax.imageio.*;class
A{public static void main(String[]x)throws
Exception{String[]a={"33623368356:356;66","33413341334535463547354735473444","33823382338:3586338>358>358>358?88","66456:466:466845684668466766","334144453546354635474746464646464647354634463446344744","88456:466:466:4668458<468<468<468:456846684668466788","33343535353231333535313133353447353434353534313133353447353545343535313133353447353545343444","33513351335233593554335433593554335935543359355433593559355835593559355935593455","33:233:233:433:B35:833:833:B35:833:B35:833:B35:833:B35:B35:833:B35:B35:B35:B35:C::","66566:576:57696869576969586969586:586969576969586857685868586766","334155453546354635463547594658465846584658473546354634463546344635463446354634463547584657465746574657473546344634463446344755","::456:466:466:466:466845:@46:@46:@46:@46:>4568466:4668466:4668466:4668466:4668466845:>46:>46:>46:>46:<45684668466846684667::","333531333434343132333434353531313335343434323232323334343435353231333133343556343434313233323335345935353532313331313132333233353535343557343133343556343434355934353535593432333234355935323335345935323335345935323335345935343459313334353455"};BufferedImage
m=new BufferedImage(1300,1300,1);Graphics2D g=m.createGraphics();g.translate(500,500);String
s=a[Integer.valueOf(x[0])-1];int f=1,i=0,n,t;while(i<s.length()){n=s.charAt(i++)-48;t=s.charAt(i++);while(t-->48){g.drawLine(0,0,20,0);g.translate(20,0);g.rotate(f*Math.PI*2/n);}f=-f;}ImageIO.write(m,"png",new File("o.png"));}}

Ungolfed:

import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class A {
    static int f = 1;
    static Graphics2D g;

    static void fixtrans() {
        double[] m = new double[6];
        g.getTransform().getMatrix(m);
        for (int i = 0; i < 6; ++i) {
            if (Math.abs(m[i] - Math.round(m[i])) < 1e-5) {
                m[i] = Math.round(m[i]);
            }
        }
        g.setTransform(new AffineTransform(m));
    }

    static void d(String s) {
        for (int i = 0; i < s.length();) {
            int n = s.charAt(i++) - '0';
            int t = s.charAt(i++) - '0';
            for (int j = 0; j < t; ++j) {
                g.drawLine(0, 0, 20, 0);
                g.translate(20, 0);
                g.rotate(f * Math.PI * 2 / n);
                fixtrans(); // optional, straightens some lines
            }
            f = -f;
        }
    }

    public static void main(String[] args) throws Exception {
        String[] a = {
                "33623368356:356;66",
                "33413341334535463547354735473444",
                "33823382338:3586338>358>358>358?88",
                "66456:466:466845684668466766",
                "334144453546354635474746464646464647354634463446344744",
                "88456:466:466:4668458<468<468<468:456846684668466788",
                "33343535353231333535313133353447353434353534313133353447353545343535313133353447353545343444",
                "33513351335233593554335433593554335935543359355433593559355835593559355935593455",
                "33:233:233:433:B35:833:833:B35:833:B35:833:B35:833:B35:B35:833:B35:B35:B35:B35:C::",
                "66566:576:57696869576969586969586:586969576969586857685868586766",
                "334155453546354635463547594658465846584658473546354634463546344635463446354634463547584657465746574657473546344634463446344755",
                "::456:466:466:466:466845:@46:@46:@46:@46:>4568466:4668466:4668466:4668466:4668466845:>46:>46:>46:>46:<45684668466846684667::",
// bad          "333531333434343132333434353531313335343434323232323334343435353231333133343556343434313233323335345935353532313331313132333233353535343557343133343556343434355934353531333459343434355935323335345935323335345935323335345935323335345935353455"
                "333531333434343132333434353531313335343434323232323334343435353231333133343556343434313233323335345935353532313331313132333233353535343557343133343556343434355934353535593432333234355935323335345935323335345935323335345935343459313334353455"};

        BufferedImage img = new BufferedImage(1300, 1300, BufferedImage.TYPE_INT_RGB);
        g = img.createGraphics();
        g.translate(500, 500);
        d(a[Integer.parseInt(args[0]) - 1]);
        String f = args[0] + ".png";
        ImageIO.write(img, "png", new File(f));
    }
}

Результаты (обрезанные, отрицательные, объединенные и масштабированные):

Результаты

Формы довольно необычные :), но, насколько я могу судить, верны (дайте мне знать, если обнаружите какие-либо ошибки). Они были сгенерированы (в отдельной программе) путем построения графа лица и циклов резки в DFS.

Я уверен, что это может быть гораздо лучше, например, с использованием питона и черепахи.

Редактировать: упс, последний случай был самопересекающимся. Я исправил код (вручную), вот обновленное изображение:

13 исправлено

уйти, потому что SE это зло
источник
Означает ли исправление от руки, что код по-прежнему выводит самопересечение? Это единственное, что отделяет это от правильного ответа?
трихоплакс
@githubphagocyte Если бы он все еще выводил самопересечение, это не было бы исправлением. Это правильный ответ.
Адицу ушел, потому что SE ЗЛО
Это было помечено, потому что оно нарушает одно из правил нашего справочного центра : все решения проблем должны [...] быть серьезным претендентом на критерии победы в использовании. Например, для участия в соревновании по коду необходимо сыграть в гольф.
Деннис
@ Денис, лучше, мистер. полицейский? : p
aditsu ушел, потому что SE это ЗЛО
6

Mathematica

Вне конкуренции, не свободный язык

f[n_] := PolyhedronData[Sort[PolyhedronData["Archimedean", 
                                             {"FaceCount", "StandardName"}]][[n, 2]],  "NetImage"]

Использование:

f /@ Range@13

Математическая графика

Доктор Велизарий
источник