Jump to content
  • 0

( почему не получаеться нарисовать фигуру из точек?


malanka
 Share

Question

:mad:Подскажите пожалуйста, почему код рисует только одну линию и не хочет выводить всю фигуру?

Код:

<?php
//класс точки
class Point{
public $x;
public $y;
public $picture;
//метод для прорисовки точки.
public function ShowPoint(){
$r=rand(0,255); //случайным образом находим цвет точки
$g=rand(0,255);
$b=rand(0,255);
$col=imagecolorallocate($this->picture,$r,$g,$b);
imagesetpixel($this->picture,$this->x,$this->y,$col);
}
}
//класс линии
class Line extends Point {
public $x1; //координаты начала и конца линии
public $x2;
public $y1;
public $y2;
// выщитываем по у координаты точек для линии и отправляем их на прорисовку
public function ShowLineY(){
if($this->y1>$this->y2){
for($temp_y=$this->y2;$temp_y<$this->y1;$temp_y++){
$this->y=$temp_y;
$this->x=((($temp_y-$this->y1)*($this->x2-$this->x1))/($this->y2-$this->y1))+$this->x1;
$this->ShowPoint();
}
}
else{
for($temp_y=$this->y1;$temp_y<$this->y2;$temp_y++){
$this->y=$temp_y;
$this->x=((($temp_y-$this->y1)*($this->x2-$this->x1))/($this->y2-$this->y1))+$this->x1;
$this->ShowPoint();
}
}
}
// выщитываем по х координаты точек для линии и отправляем их на прорисовку
public function ShowLineX(){
if($this->x1>$this->x2){
for($temp_x=$this->x2;$temp_x<$this->x1;$temp_x++){
$this->x=$temp_x;
$this->y=((($temp_x-$this->x1)*($this->y2-$this->y1))/($this->x2-$this->x1))+$this->y1;
$this->ShowPoint();
}
}
else{
for($temp_x=$this->x1;$temp_x<$this->x2;$temp_x++){
$this->x=$temp_x;
$this->y=((($temp_x-$this->x1)*($this->y2-$this->y1))/($this->x2-$this->x1))+$this->y1;
$this->ShowPoint();
}
}
}
public function directionLine(){
//определяем по чем (y или x)лучше выщитывать вторую координату точки
$difference_x=$this->x1-$this->x2;
if($difference_x<0)
$difference_x*=-1;
$difference_y=$this->y1-$this->y2;
if($difference_y<0)
$difference_y*=-1;
//ид?м в нужную функцию для прорисовки точки
if($difference_x<$difference_y)
$this->ShowLineY();
else
$this->ShowLineX();
}
}
class Figura extends Line {
public $size; //количество вершин в фигуре
public $corner_x; //массив координат х-ов
public $corner_y; //массив координат у-ов

function __construct($s,$c_x,$c_y){
$this->size=$s;
$this->corner_x=$c_x;
$this->corner_y=$c_y;
}
public function ShowFigura(){
//выбираем из массивов координат начало и конец линии
for($i=0;$i<$this->size;$i++){
if($i+1==$this->size){
$this->x1=$this->corner_x[$i];
$this->y1=$this->corner_y[$i];
$this->x2=$this->corner_x[0];
$this->y2=$this->corner_y[0];
}
else{
$this->x1=$this->corner_x[$i];
$this->y1=$this->corner_y[$i];
$this->x2=$this->corner_x[$i+1];
$this->y2=$this->corner_y[$i+1];
}
$this->directionLine();
}
}
}
// для тестов координаты треугольника
$corner=3;
$mas_x=array(10,300,10);
$mas_y=array(30,200,200);
//инициализация объекта класса
$fig=new Figura($corner,$mas_x,$mas_y);
$fig->picture=imagecreate(400,400);
$bg_col = imagecolorallocate($fig->picture,255,255,255);

//вызываем прорисовку
$fig->ShowFigura();
imagepng ($fig->picture);
?>

Link to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 0

при чем тут заголовки, если товарищ спрашивает почему не рисуется точка? %) ниасилил

2malanka, а протрассить слабо? можно поумному, можно по-простому, по-простому - вывод на страницу данных переменных. а потом посмотреть, те ли данные там, что нужно?

Link to comment
Share on other sites

  • 0

Да прости malanka я и вправду не осилил твой код - чем такого лечить легче нового родить :), но могу сказать что у тебя не рисуется скорее всего из-за того что нужно закрашивать фон другим цветом использую функцию imagefill()

Потом malanka ты немножко неправильно используешь наследование, и не подписываешь свой код, мой тебе совет комментируй его будет не только нам легче но и тебе, а пока что в нем легко потеряться

Вот мой код - в нем используя наследование можно хорошо облегчить себе жизнь. Он рисует пустой холст, точку и линию, если не ставить imagefill() то все что рисуется будет таким же цветом что и холст и ты ничего не увидишь.

<?php
# Главный класс который задает все наше изображение
class Image {
// Конструктор задаем ширину и высоту изображения
public function __construct($w, $h){
$this->W = $w;
$this->H = $h;
}
// Метод - создаем изображение
public function create_image(){
$this->im = imagecreate($this->W, $this->H);
}
// Метод - задает цвет всего изображения
public function set_color(){
$r = rand(0,255);
$g = rand(0,255);
$b = rand(0,255);
$this->col = imagecolorallocate($this->im, $r, $g, $b);
}

public $W; // Ширина
public $H; // Высота
public $im; // Метка изображения
public $col; // Цвет
}

# Класс который рисует точку
class Point extends Image {
// Конструктор задаем размеры изображения и выводим точку
public function __construct($w, $h, $x = null, $y = null)
{
parent::__construct($w, $h);
$this->X = $x;
$this->Y = $y;
}

// Метод рисуем точку (на сером фоне)
public function draw(){
$color = imagecolorallocate($this->im, 185, 185, 185);
imagefill($this->im, 0, 0, $color);
imagesetpixel($this->im, $this->X, $this->Y, $this->col);
}

public $X; // Координаты х
public $Y; // Координаты y
}

# Класс который рисует линию
class Line extends Image {
// Конструктор задаем размеры изображения и выводим точку
public function __construct($w, $h, $x = null, $y = null, $x2 = null, $y2 = null)
{
parent::__construct($w, $h);
$this->X = $x;
$this->X2 = $x2;
$this->Y = $y;
$this->Y2 = $y2;
}

// Метод рисуем линию (на сером фоне)
public function draw(){
$color = imagecolorallocate($this->im, 185, 185, 185);
imagefill($this->im, 0, 0, $color);
imageline($this->im, $this->X, $this->Y, $this->X2, $this->Y2, $this->col);
}

public $X; // Первая координата для рисования линии по х
public $Y; // Первая координата для рисования линии по y
public $X2; // Вторая координата для рисования линии по х
public $Y2; // Вторая координата для рисования линии по у
}

/*
$obj = new Image(400, 400); - пустой холст
$obj = new Point(400, 400, 50, 50); - точка
Методы везде одни и теже:
$obj->create_image(); создаем изображение
$obj->set_color(); задаем цвет
$obj->draw(); рисуем
*/

// Рисуем линию
$obj = new Line(400, 400, 50, 50, 150, 150);
$obj->create_image();
$obj->set_color();
$obj->draw();
header("Content-type: image/png");
imagepng($obj->im);
imagedestroy($obj->im);
?>

Напиши что ты хотела нарисовать и мы тебе поможем :)

Link to comment
Share on other sites

  • 0

спасибо, что отозвались и выложили подробный код, мне пока трудно их(коды) писать так как я недавно програмирую и очень нехватает простых примеров.Мне в программе необходимо построить график ,но обязательно из точек не используя стандартную функцию для прорисовки линии. В своем коде я пыталась нарисовать теугольник, а вообще пыталась создать программу для рисования любой фигуры по заданным вершинам.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy