Früchtemüsli
2013-09-10, 15:39:29
Hi :)
Ich versuche, eine Berechnung eines Professors nachzuvollziehen. Aber egal, was ich versuche, ich komme nicht auf sein Ergebnis. Ich habe es mit einer grafischen Skizze versucht und ich habe es auch schon mit einem Programm versucht. Aber ich bekomme immer was ganz anderes.
Es geht um http://www-lehre.inf.uos.de/~cg/2012/, Vorlesung vom Mo, 04.06. Und zwar geht es um das clipping in den camera-coordinates. Seiten 12 und 13 in der PDF oder von Minute 12 bis 18 in den Videos (z. B opencast). Und zwar geht es um dieses t(s).
Bei ihm ist es ungefähr 0.01. Bei mir ist es ungefähr 0.005.
Versteh ich das alles falsch oder hat da der Prof tatsächlich einen Rechenfehler gemacht?
Hier übrigens mein Test-Programm:
<?php
error_reporting(~0);
class Vector
{
public $x;
public $y;
public $z;
public $w;
function __construct($x, $y, $z, $w = 0)
{
$this->x = $x;
$this->y = $y;
$this->z = $z;
$this->w = $w;
}
/**
* ignoriert w
*/
function length()
{
return sqrt
(
pow($this->x, 2) +
pow($this->y, 2) +
pow($this->z, 2)
);
}
/**
* ignoriert w
*/
function normalize()
{
$l = $this->length();
return new Vector
(
$this->x / $l,
$this->y / $l,
$this->z / $l
);
}
}
class Line
{
public $v0;
public $v1;
function __construct(Vector $v0, Vector $v1)
{
$this->v0 = $v0;
$this->v1 = $v1;
}
}
class Plane
{
public $a;
public $b;
public $c;
public $d;
/**
* @param Vector $n normalisierte Normale, zeigt nach oben (innen)
* @param number $d
* @throws Exception
*/
function __construct(Vector $n, $d)
{
if($n->w != 0)
throw new Exception('n');
$this->a = $n->x;
$this->b = $n->y;
$this->c = $n->z;
$this->d = $d;
}
function intersectWithLine(Line $line)
{
$v0 = $line->v0;
$v1 = $line->v1;
$x0 = $v0->x;
$y0 = $v0->y;
$z0 = $v0->z;
$x1 = $v1->x;
$y1 = $v1->y;
$z1 = $v1->z;
$p =
($x1 - $x0) * $this->a +
($y1 - $y0) * $this->b +
($z1 - $z0) * $this->c;
if($p == 0)
return null;
$t = -($x0 * $this->a + $y0 * $this->b + $z0 * $this->c + $this->d) / $p;
if($t < 0 || $t > 1)
return false;
var_dump($t);
return new Vector
(
$x0 + $t * ($x1 - $x0),
$y0 + $t * ($y1 - $y0),
$z0 + $t * ($z1 - $z0),
1
);
}
}
$data =
[
// ein eigener Test:
[
[-4, -3, 0], // Ebenen-Normale
5, // Ebene d
[1.5, 3, 0], // Linie Punkt a
[4.5, 9, 0], // Linie Punkt b
[2.5, 5, 0] // Schnittpunkt
],
// Daten aus der UNI-Vorlesung:
[
[-0.001, 0, -0.0005], // Ebenen-Normale (near, 0, -right)
0, // Ebene d
[0, 0, -0.01], // Linie Punkt a
[1, 0, -0.05], // Linie Punkt b
[1, 2, 3] // Schnittpunkt??
]
];
foreach($data as $test)
{
// Normale auf Ebene:
$n = new Vector($test[0][0], $test[0][1], $test[0][2]);
$n = $n->normalize();
// Ebene:
$plane = new Plane($n, $test[1]);
// Gerade:
$line = new Line(new Vector($test[2][0], $test[2][1], $test[2][2], 1), new Vector($test[3][0], $test[3][1], $test[3][2], 1));
// Ebene mit Gerade schneiden:
$s = $plane->intersectWithLine($line);
var_dump($s);
}
?>
Ich versuche, eine Berechnung eines Professors nachzuvollziehen. Aber egal, was ich versuche, ich komme nicht auf sein Ergebnis. Ich habe es mit einer grafischen Skizze versucht und ich habe es auch schon mit einem Programm versucht. Aber ich bekomme immer was ganz anderes.
Es geht um http://www-lehre.inf.uos.de/~cg/2012/, Vorlesung vom Mo, 04.06. Und zwar geht es um das clipping in den camera-coordinates. Seiten 12 und 13 in der PDF oder von Minute 12 bis 18 in den Videos (z. B opencast). Und zwar geht es um dieses t(s).
Bei ihm ist es ungefähr 0.01. Bei mir ist es ungefähr 0.005.
Versteh ich das alles falsch oder hat da der Prof tatsächlich einen Rechenfehler gemacht?
Hier übrigens mein Test-Programm:
<?php
error_reporting(~0);
class Vector
{
public $x;
public $y;
public $z;
public $w;
function __construct($x, $y, $z, $w = 0)
{
$this->x = $x;
$this->y = $y;
$this->z = $z;
$this->w = $w;
}
/**
* ignoriert w
*/
function length()
{
return sqrt
(
pow($this->x, 2) +
pow($this->y, 2) +
pow($this->z, 2)
);
}
/**
* ignoriert w
*/
function normalize()
{
$l = $this->length();
return new Vector
(
$this->x / $l,
$this->y / $l,
$this->z / $l
);
}
}
class Line
{
public $v0;
public $v1;
function __construct(Vector $v0, Vector $v1)
{
$this->v0 = $v0;
$this->v1 = $v1;
}
}
class Plane
{
public $a;
public $b;
public $c;
public $d;
/**
* @param Vector $n normalisierte Normale, zeigt nach oben (innen)
* @param number $d
* @throws Exception
*/
function __construct(Vector $n, $d)
{
if($n->w != 0)
throw new Exception('n');
$this->a = $n->x;
$this->b = $n->y;
$this->c = $n->z;
$this->d = $d;
}
function intersectWithLine(Line $line)
{
$v0 = $line->v0;
$v1 = $line->v1;
$x0 = $v0->x;
$y0 = $v0->y;
$z0 = $v0->z;
$x1 = $v1->x;
$y1 = $v1->y;
$z1 = $v1->z;
$p =
($x1 - $x0) * $this->a +
($y1 - $y0) * $this->b +
($z1 - $z0) * $this->c;
if($p == 0)
return null;
$t = -($x0 * $this->a + $y0 * $this->b + $z0 * $this->c + $this->d) / $p;
if($t < 0 || $t > 1)
return false;
var_dump($t);
return new Vector
(
$x0 + $t * ($x1 - $x0),
$y0 + $t * ($y1 - $y0),
$z0 + $t * ($z1 - $z0),
1
);
}
}
$data =
[
// ein eigener Test:
[
[-4, -3, 0], // Ebenen-Normale
5, // Ebene d
[1.5, 3, 0], // Linie Punkt a
[4.5, 9, 0], // Linie Punkt b
[2.5, 5, 0] // Schnittpunkt
],
// Daten aus der UNI-Vorlesung:
[
[-0.001, 0, -0.0005], // Ebenen-Normale (near, 0, -right)
0, // Ebene d
[0, 0, -0.01], // Linie Punkt a
[1, 0, -0.05], // Linie Punkt b
[1, 2, 3] // Schnittpunkt??
]
];
foreach($data as $test)
{
// Normale auf Ebene:
$n = new Vector($test[0][0], $test[0][1], $test[0][2]);
$n = $n->normalize();
// Ebene:
$plane = new Plane($n, $test[1]);
// Gerade:
$line = new Line(new Vector($test[2][0], $test[2][1], $test[2][2], 1), new Vector($test[3][0], $test[3][1], $test[3][2], 1));
// Ebene mit Gerade schneiden:
$s = $plane->intersectWithLine($line);
var_dump($s);
}
?>