114 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
/*
 | 
						|
 * ▓▒░
 | 
						|
 * »«º×■·
 | 
						|
 * ╔ ╚ ╝ ╗ ║ ═
 | 
						|
 */
 | 
						|
 | 
						|
use Automata\NC;
 | 
						|
use Automata\ToolData;
 | 
						|
 | 
						|
require_once __DIR__ . '/../vendor/autoload.php';
 | 
						|
 | 
						|
const W = 128;
 | 
						|
const H = 96;
 | 
						|
 | 
						|
$nc = new NC();
 | 
						|
$nc->TM->write(new ToolData(1, 5500, 2));
 | 
						|
$nc->TM->write(new ToolData(2, 3000, 61379));
 | 
						|
(new ProgramLoader)->loadPrograms($nc);
 | 
						|
 | 
						|
$nc->loadProgram(9002);
 | 
						|
 | 
						|
$xBuffer = [];
 | 
						|
$zBuffer = [];
 | 
						|
while ($nc->PPMC->ready()) {
 | 
						|
	$startingPosition = new Vector2D($nc->DR->X, $nc->DR->Z);
 | 
						|
	$centre = new Vector2D($nc->DR->I, $nc->DR->K);
 | 
						|
	$nc->step();
 | 
						|
	$endingPosition = new Vector2D($nc->DR->X, $nc->DR->Z);
 | 
						|
	switch ($nc->DR->G_TRAVERSE) {
 | 
						|
		case 2:
 | 
						|
		case 3:
 | 
						|
			// Circular
 | 
						|
			$arc = new Arc2D($startingPosition, $endingPosition, $centre);
 | 
						|
			dump($arc);
 | 
						|
			readline();
 | 
						|
		default:
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	$diff = $endingPosition->diff($startingPosition);
 | 
						|
 | 
						|
	readline();
 | 
						|
	p($endingPosition);
 | 
						|
	usleep(100000);
 | 
						|
}
 | 
						|
 | 
						|
function p(Vector2D $v): void
 | 
						|
{
 | 
						|
	system('clear');
 | 
						|
	$x = map($v->x, -1000 * W, 1000 * W, 0, W);
 | 
						|
	$z = map($v->y, -1000 * H, 1000 * H, 0, H);
 | 
						|
	print('╔' . str_repeat('═', W) . '╗' . PHP_EOL);    // Top
 | 
						|
	print(str_repeat("║" . str_repeat(' ', W) . "║\n", $z - 1));
 | 
						|
	print('║' . str_repeat(' ', $x - 1) . 'X' . str_repeat(' ', W - $x) . "║\n");
 | 
						|
	print(str_repeat("║" . str_repeat(' ', W) . "║\n", H - $z));
 | 
						|
	print('╚' . str_repeat('═', W) . '╝' . PHP_EOL); // Bottom
 | 
						|
}
 | 
						|
 | 
						|
function map(int $x, int $in_min, int $in_max, int $out_min, int $out_max): int
 | 
						|
{
 | 
						|
	return ($x - $in_min) * ($out_max - $out_min) / ($in_max - $in_min) + $out_min;
 | 
						|
}
 | 
						|
 | 
						|
class Vector2D
 | 
						|
{
 | 
						|
	public float $x;
 | 
						|
	public float $y;
 | 
						|
 | 
						|
 | 
						|
	public function __construct(float $x, float $y)
 | 
						|
	{
 | 
						|
		$this->x = $x;
 | 
						|
		$this->y = $y;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	public function length(): float
 | 
						|
	{
 | 
						|
		return sqrt($this->x ** 2 + $this->y ** 2);
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	public function diff(self $other): self
 | 
						|
	{
 | 
						|
		return new self(
 | 
						|
			sqrt(($this->x - $other->x) ** 2),
 | 
						|
			sqrt(($this->y - $other->y) ** 2)
 | 
						|
		);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
class Arc2D
 | 
						|
{
 | 
						|
	public Vector2D $start;
 | 
						|
	public Vector2D $end;
 | 
						|
	public Vector2D $centre;
 | 
						|
 | 
						|
 | 
						|
	public function __construct(Vector2D $start, Vector2D $end, Vector2D $centre)
 | 
						|
	{
 | 
						|
		$this->start = $start;
 | 
						|
		$this->end = $end;
 | 
						|
		$this->centre = $centre;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	public function radius(): float
 | 
						|
	{
 | 
						|
		return $this->start->diff($this->centre)->length();
 | 
						|
	}
 | 
						|
}
 |