2016-12-09 25 views
0

Ich versuche, eine prozedurale Form aus Quads zu erstellen.Suchen der Zeile eines Objekts

Ich möchte in der Lage sein, jede Quad zu nehmen und es Index zu finden die Zeile zu verwenden, dass es in ist.

Nimm Quad 9 aus dem Bild. Welche Art von Funktion kann ich verwenden, um die Zeile zu finden (in diesem Fall ist es 2 von einem 0-Index). Was ist mit Quad 20?

Die Reihen ändern sich immer in der Breite um 2 Quads, eine von jeder Seite entfernt.

Es tut mir leid, es ist ein wenig verworren, aber ich bin mir nicht sicher, wie ich das Problem angehen soll.

QuadDiagram

+0

Wie können wir, wie viele Quads in jeder Reihe wissen? Oder gibt es jedes Mal ein Diagramm? Welche interne Repräsentation haben Sie gewählt? Zum Beispiel kann ich mir eine Summierung vorstellen, bis die Anzahl der Quads in der aktuellen Zeile Sie über den Index bringen würde (oder mabe gleich, erfordert Gedanken), aber das setzt voraus, dass Sie ein Array mit der Anzahl der Quads in jeder Zeile haben. –

+0

Nun, die Form wird durch den Durchmesser (unsere Eingabe) definiert, der immer ein Vielfaches von zwei ist (4, 6, 8, 10), sodass er über die X- und Y-Achse gespiegelt wird, ohne Quads zu teilen. Da wir zwei Quads für jeden Schritt entfernen, können wir die Anzahl der Quads in einer Reihe erhalten, indem wir das Doppelte der Distanz zum Zentrum subtrahieren. So können wir im Beispielbild die zweite Zeile von oben betrachten. Der Abstand zum Mittelpunkt = (Durchmesser/2) - Reihe und numOfQuadsinRow = Durchmesser - (Abstand * 2) =. Die zweite Zeile hat also einen Abstand von 1, 6 - (1 * 2) = 4. –

+0

In Ihrem 0-Indexschema beginnt die n-te Zeile bis zur Mitte mit n (n + 1) und endet mit (n + 1) (n + 2) -1. Es fühlt sich an, als ob man eine Quad-Zahl bis zur Mitte gegeben hätte, man könnte die quadratische Gleichung n^2 + n-quad = 0 lösen und die Antwort abschneiden. (Nimm auch das Plus-Quadrat in der quadratischen Formel). Noch zu vertiefen ist, wie Sie wissen, wo die Mitte ist, indexweise, und wie man Symmetrie verwendet, um einen Fall über die Mitte hinaus auf einen davor zu reduzieren. –

Antwort

1

Angenommen Durchmesser d und quad Anzahl q. Ich behaupte, die Zeilen gehen von 0 bis d-1. Darüber hinaus gibt es (d/2) (2 + d) Elemente. Der einfachere Fall ist, wenn 0 < = q < (d/4) (2 + d) In diesem Fall sind wir in der ersten Hälfte. Dann wird der Index abgeschnitten ((- 1 + sqrt (1 + 4 * q))/2). Dies ergibt sich aus der Beobachtung, dass Reihe n mit n (n + 1) beginnt, was formal mit der Summe einer arithmetischen Reihe gezeigt werden könnte, dann rückwärts arbeiten und die quadratische Gleichung lösen würde. Auf der anderen Seite, wenn wir in der zweiten Hälfte sind (d/4) (2 + d) < = q < (d/2) (2 * d) und wir lösen, indem Sie den Offset vom Ende. Sei q '(d/2) (2 + d) -1-q. Wenden Sie die obige Indexformel auf q 'anstelle von q an und subtrahieren Sie das Ergebnis von d-1, um den Index von qs Zeile zu erhalten. Ich bin vielleicht hier oder dort, aber ich denke, das ist der Kern davon.

0

Ich dachte, da dies auf einer Programmierseite gepostet wurde, wäre es vielleicht logischer, eine Funktion zu geben, die man implementieren könnte, ohne viel Mathe herauszuziehen, und stattdessen einfach auf Addition angewiesen ist. Ich denke, es wäre einfacher zu folgen und schwerer zu durcheinander zu bringen (obwohl ich vielleicht meine Fähigkeit unterschätze, etwas zu vermasseln, und das habe ich fast schon getan).

var quadRowIndex = function (diameter, quadNumber) { 
 
//diameter should be a positive even number 
 
//quadNumber should be between 0 and index of last number in last row (inclusive) 
 
var quadIndex = 0; //holds the RowIndex, which the function will return once the row contains quadNumber 
 
var rowStartNum = 0; 
 
var rowLength = 2; 
 

 
//iterate through first half 
 
while (rowLength <= diameter) { 
 
    rowStartNum += rowLength; 
 
    if (rowStartNum > quadNumber) { 
 
     return quadIndex; 
 
    } 
 
    quadIndex++; 
 
    rowLength += 2; 
 
} 
 
rowLength -= 2; 
 
//iterate through second half if still here 
 
while (rowLength >= 2) { 
 
    rowStartNum += rowLength; 
 
    if (rowStartNum > quadNumber) { 
 
     return quadIndex; 
 
    } 
 
    quadIndex++; 
 
    rowLength -= 2; 
 
} 
 
//still here -- number was too high, return error signal 
 
return -1; 
 
}; 
 
console.log(quadRowIndex(6, 9)); 
 
console.log(quadRowIndex(6, 20)); 
 
console.log(quadRowIndex(6, 100));

Verwandte Themen