Zur Boardunity Forenstartseite

Zurück   Boardunity & Video Forum » Technik » Programmierung und Datenbanken

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1  
Alt 02.06.2005, 13:26
Mitglied
 
Registriert seit: 04.2005
Beiträge: 66

Hex-Koordinaten


Hi, ich möchte folgendes machen:

Ich habe eine ID, aufsteigende Nummerierung, anhand dieser möchte ich Objekte, änlich wie bei einem Polarem Koordinatensystem anordenen, sodass das ganze letztendlich jedoch wie ein Hex-Koord System aussieht.

Das wäre so:
Im Zentrum ist die 1, der erste Ring rund herum wäre die Zahlen 2 bis 6, im 3ten Ring wären um 5 Zahlen mehr als im 2ten usw ....
Die x Achse wäre "gerade", die y-Achse jedoch "schräg" nach rechts.

Für ein "viereck"-System, also aus einer ID auf ein "normales" x/y System umzurechnen, schaffte ich fast. Problem hatte ich durch Rundungsfehler, die ich noch nicht korregieren konnte, so hatte ich manche Zahlen doppelt.

Bei dem Hex-System ist auch das Problem, Abstände zwischen 2 Punkten richtig zu berechnen.

Ich wäre sehr dankbar für Anregungen.
  #2  
Alt 03.06.2005, 14:07
Mitglied
 
Registriert seit: 04.2005
Beiträge: 66
Das ist mein Code für das 4-Eck System.

Es funktioniert einigermaßen gut. Das Problem, das ich habe:
bei 14.8 möchte ich 15, bei 16.1 möchte ich 16.
Das wäre mit ROUND kein Problem.
Nun will ich aber bei 350.58789 350 und nicht 351. Hier wäre ein floor notwendig, was beim oberen Fall wieder nicht stimmen würde.

Scheinbar gibt mir ATAN nicht den Winkel den ich benötige ...

PHP-Code:
function XY_TO_ID$x$y )
{
    global 
$pi;
    
    
$r abs$y ) + abs$x ) ;
    
$rt sqrt$y $y $x $x );
    
    
$w atan2$y $x );
    
    if( 
$w $w 2*pi() + $w;
    
    echo 
$w."<br>";
    
    if( 
$r == )
        
$z 1;
    else
        
$z $r * ( $r -1)  +  * ( $r ) * $w/pi() + 2;
    
    
$z round$z 5);    
        
    return 
$z;
}

function 
ID_TO_XY$id )
{
    
$r 0;
    while( 
$id 2*$r*($r+1)+)
    {
        
$r++;
    }
    
$o =  $id - (2*$r*($r-1) )- 2;
    
    
    if( 
$r == 
        
$w=0;
    else
        
$w deg2rad$o $r 360 );
        
    echo 
rad2deg($w)."<br>";
            
    
$x$r*cos($w);
    
$y$r*sin($w);

    
$v abs($x)+abs($y);
    
    if (
$v != 0)
    {
        
$xn $r*$x/$v;
        
$yn $r*$y/$v;
    }
    else 
    {
        
$xn 0;
        
$yn 0;
    }

    
$x round($xn,5);
    
$y round($yn,5);

    return array( 
'x' => $x'y' => $y );
}

$koords ID_TO_XY349 );
echo 
"X:".$koords['x']." Y:".$koords['y'];
echo 
"<br>";
$koords ID_TO_XY350 );
echo 
"X:".$koords['x']." Y:".$koords['y'];

$r 12;
$s 2*$r-1;

$c pow$s ,2);

$e $r*($r-1);

echo 
"<table border='1'>\n";

for(
$i=0;$i<$s;$i++)
{
    echo 
"<tr>";
    for(
$j=0;$j<$s;$j++)
    {
        echo 
"<td>";
        
        
$ij_x =  $j-$r+1// offset dabei
        
$ij_y $r-1-$i;

        
$z XY_TO_ID$ij_x$ij_y );
        
$koords ID_TO_XY$z );
            
        echo 
"<b>".$z."</b><br>";
        echo 
$ij_x."/".$ij_y;
        echo 
"<br>".$koords['x']."/".$koords['y'];
        
        echo 
"</td>";        
    }
    echo 
"</tr>\n";
}
echo 
"</table>\n"

Antwort


Stichworte
-


Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
Gehe zu






1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25