2012-04-24 3 views
10

Ich habe ein cooles Problem. Ich versuche genau 50% der Masse dieses Truthahns hervorzuheben. In der Praxis wird es nicht 50% sein, aber wenn ich 50% bekomme, kann ich den Rest ausmachen.Wie schneide ich die Hälfte eines Thanksgiving-Truthahns?

Meine derzeitige Idee ist dies: Scannen Sie in jedem Pixel, um die Masse des Truthahns in Pixel zu finden. Dann, wenn ich 50% der Türkei möchte, Pixel von links nach rechts markieren, bis ich 50% der Pixel markiert habe.

Hat jemand bessere Ideen? Dies ist die langsamste, brute-force Idee, die erfordert, dass jedes Pixel einmal durchlaufen wird, um die Pixel zu zählen und wieder 50% davon hervorzuheben.

Beachten Sie, dass das vertikale Teilen des Bildes nicht 50% des Truthahns ausmacht, da der Körper des Truthahns viel fleischiger ist als sein Hals.

This is a Turkey

+1

Wer hat gewählt, um dies zu schließen .. Dies ist ein ernstes Problem. Ich versuche eine Infografik zu erstellen, die einen Truthahn basierend auf einigen Prozentsätzen färbt. – DanRedux

+2

@DanRedux: Aber in seinem aktuellen Zustand ist es kein Programmierproblem. Du fragst nur nach Methoden; Wie würdest du das machen? Es ist mehr zum Thema für Programmierer. – animuson

+0

Sind Sie sicher, dass Sie 50% der Pixel und nicht 50% eines linearen Maßes hervorheben möchten? Ich glaube nicht, dass Menschen gut darin sind, Volumen oder Fläche zu beurteilen, indem sie komplexe Formen betrachten. –

Antwort

3

Sie sagen, dass der Prozentsatz wird sich ändern, aber ich werde auf ein Glied hier gehen und übernehmen Sie die Türkei selbst nicht.

Sie müssen also nicht zweimal Schleife. Sie müssen es nur einmal tun, die Daten in eine Form von Struktur abbilden, die Sie referenzieren können, und sich dann nur jedes Mal darauf beziehen, wenn Sie hervorheben müssen, um herauszufinden, wie weit Sie gehen müssen.

Zum Beispiel machen ein assoziatives Array von <percentage of mass (integer out of a hundred) => vertical column number (int)>

diese Weise, wenn Sie Schatten x Prozent benötigen, können Sie nur eine Schleife über cached_data müssen [percent_to_highlight] Spalten von Pixeln, schattiert sie alle, und dann ausbrechen von der Schleife vollständig, sobald Sie es erreichen.


Für noch mehr Leistung, haben Sie zwei Bilder - ein voll schattiertes plus Ihr normales. Das assoziative Array percentage => byte_offset

Für jedes Bild Karte sollen Sie einfach Memcpy oder was auch immer die PHP-Äquivalent einer schnell generieren wollen, lag im Bereich von 0 -> byte_offset des schattierten Bildes über die nicht-schattierten kopieren und speichern. Keine Schleife mehr. Sie können nicht schneller als das.

+0

Eigentlich mache ich das schon.Ich hätte angeben sollen, aber ja, wenn ich meine Methode machen würde, würde ich sie in einen Pixelstrom umwandeln und sie einen bestimmten Prozentsatz von ihnen streamen. – DanRedux

+0

Wenn Sie genau das tun, was ich gepostet habe ... wie können Sie eine bessere Leistung als O (N/x) erhalten, wobei x die Umkehrung der Menge ist, die Sie schattiert benötigen? –

+0

Möglicherweise mit einer Art von Baum/Matrix von Pixeln, die ich hervorheben kann ... Wie wenn ich um 10% bitten würde, könnte ich sicherlich einige Abkürzungen anstelle von 10% der Pixel und zeichnen sie zeichnen denke an irgendein anderes Format, das es weniger als O (n/x) machen würde. – DanRedux

0

Das Problem sieht nicht aus, einen intelligenten Algorithmus über meinen Kopf zu haben, um es zu tun. Aber ich bin auch kein CG-Experte, also könnte ich mich da irren.

Und der Versuch, nach einer solchen Lösung zu suchen, kann sehr wohl die Zeitkomplexität erhöhen (als O (n)), wenn Sie verschachtelte Schleifen auf n verwenden, wobei n die Gesamtzahl der vom Truthahn verwendeten Pixel ist.

Stattdessen ist es sehr einfach, die Zwei-Wege-Methode zu implementieren (sehr viel weniger Zeit/Aufwand zu implementieren) und auch O (n) die Konstante 2 zu vernachlässigen, was keine schlechte Lösung ist. Je nachdem für welchen Zweck, Hardware, Platzbeschränkung usw. schreiben Sie diese Lösung für; die zwei Passage zu gehen könnte lohnender sein.

Verwandte Themen