Рисование 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 исправлено


Означает ли исправление от руки, что код по-прежнему выводит самопересечение? Это единственное, что отделяет это от правильного ответа?
— трихоплакс

@githubphagocyte Если бы он все еще выводил самопересечение, это не было бы исправлением. Это правильный ответ.
— Адицу ушел, потому что SE ЗЛО

Это было помечено, потому что оно нарушает одно из правил нашего справочного центра : все решения проблем должны [...] быть серьезным претендентом на критерии победы в использовании. Например, для участия в соревновании по коду необходимо сыграть в гольф.
— Деннис

@ Денис, лучше, мистер. полицейский? : p
— aditsu ушел, потому что SE это ЗЛО


6

Mathematica

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

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

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

f /@ Range@13

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.