Малювання 3d сіток - сухих архімедів


12

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

Усі тринадцять фігур описано на http://en.wikipedia.org/wiki/Archimedean_solid та в наступній таблиці, взятої звідти.

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

Введення: Ціле число від 1 до 13. Припустимо, фігури пронумеровані точно так, як у таблиці вище, так що "усічений тетраедр" є числом 1, а "додекаедр snub" - числом 13.

Вихід: файл зображення, що містить мережу для цієї форми. Тільки контур, включаючи внутрішні лінії, добре. Не потрібно заповнювати її кольорами

Ви можете використовувати будь-яку мову програмування, яка вам подобається, а також будь-яку бібліотеку, яка не створена спеціально для цього змагання. Обидва повинні бути доступні вільно, проте (в обох сенсах) в Інтернеті.

Я прийму відповідь з найменшою кількістю персонажів рівно за тиждень. Відповіді будуть прийняті, коли вони прийдуть.

(Ні) Переможець ще. На жаль, немає дійсних учасників. Може, це занадто важко?


Може взагалі покінчити з обмеженням часу? Що робити, якщо хтось знайде це через рік. Ви хочете, щоб вони не намагалися? ... Можливо, краще б спочатку зробити платоніку, зачекайте, потім важку. Можливо, ви розділили відсотки. Для мене особисто (все це екстраполяція), коли я побачив дві подібні, я начебто відійшов від неї, відчуваючи, що не маю часу реально подивитися на обидва та спланувати, як вирішити обоє. І я не хотів би це робити іншим способом .... З іншого боку, у інших тут виникли труднощі із завданнями другої частини. Дивіться машини реєстрації Minsky. Можливо, це не ти.
luser droog

@luserdroog Спасибі Питання відредаговано. Я, можливо, варто додати, що я надіслав електронною поштою відповідь на відповідне запитання про багато людей, які люблять це! FWIW.
felipa

Я не думаю, що це важко зробити , але для гольфу потрібно декілька годин роздумів та експериментів, оскільки існує багато можливих мереж для кожного багатогранника, і вони не будуть стискатися однаково добре.
Пітер Тейлор

Відповіді:


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"));}}

Безголівки:

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 Якщо б все-таки виводився самоперетин, це не було б виправленням. Це правильна відповідь.
aditsu кинути, тому що SE - EVIL

Це було позначено, оскільки воно порушує одне з правил у нашому довідковому центрі : Усі рішення проблем повинні [...] бути серйозним претендентом на використання критеріїв виграшу. Наприклад, для участі в змаганні з кодом з гольфу потрібно пройти гольф.
Денніс

@Денніс краще зараз, г-н. поліцейський? : p
aditsu quit тому, що SE - EVIL


6

Математика

Поза конкурсом не вільна мова

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.