Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 21.12.2014, 18:11
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

рони,
Вот тебе функция:

//<canvas id="canvas" width="300" height="300" style="border: 1px solid #000"></canvas>

    function setPixel (x, y) {

        ctx.beginPath();
        ctx.moveTo(x,y);
        ctx.arc(x, y, 1, 0, Math.PI*2, true);
        ctx.fill();
        ctx.closePath();
    }
var canvas = document.getElementById('canvas'),
ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0,0,0,1)';


Можешь нарисовать на канвас то, что у тебя получилось?

Я не очень понимаю куда мне подставлять отрицательные значения из твоего кода.

Вот координаты двух линий:
x1 = 10, y1 = 10, x2 = 100, y2 = 100;
x1 = 10, y1 = 100, x2 = 100 y2 = 10;
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.

Последний раз редактировалось Gozar, 21.12.2014 в 18:15.
Ответить с цитированием
  #12 (permalink)  
Старый 21.12.2014, 18:42
Любитель
Отправить личное сообщение для JsLoveR Посмотреть профиль Найти все сообщения от JsLoveR
 
Регистрация: 16.12.2009
Сообщений: 422

Сообщение от Gozar
Допенькал как получить точки прямой по Алгоритму Брезенхема до 45* градусов. Если переставить x и y можно даже получить все точки до 90*.
Данный алгоритм подходит для абсолютно любых линий. Вот можно поиграться в песочнице.

function drawLineTo(x1, y1, x2, y2) {
	var deltaX = Math.abs(x2 - x1),
		deltaY = Math.abs(y2 - y1),
		signX = x1 < x2 ? 1 : -1,
		signY = y1 < y2 ? 1 : -1,
		error = deltaX - deltaY;
		
		setPixel(x2, y2);
		
	while (x1 != x2 || y1 != y2) {
			
		setPixel(x1, y1);
			
		var error2 = error * 2;
			
		if (error2 > -deltaY) {
			error -= deltaY;
			x1 += signX;
		}
			
		if (error2 < deltaX) {
			error += deltaX;
			y1 += signY;
		}
	}
}

Последний раз редактировалось JsLoveR, 21.12.2014 в 18:44.
Ответить с цитированием
  #13 (permalink)  
Старый 21.12.2014, 18:56
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

Сообщение от Gozar
Можешь нарисовать на канвас то, что у тебя получилось?
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
</head>

<body>
<canvas id="canvas" width="300" height="300" style="border: 1px solid #000"></canvas>

<script>

    function setPixel (x, y) {

        ctx.beginPath();
        ctx.moveTo(x,y);
        ctx.arc(x, y, 1, 0, Math.PI*2, true);
        ctx.fill();
        ctx.closePath();
    }
var canvas = document.getElementById('canvas'),
ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0,0,0,1)';

x1 = 10, y1 = 10, x2 = 100, y2 = 100;
var time = Math.abs(x1 - x2);
for (var i=0; i<time; i++)  {
  var delta = i/time ;
  var a =  delta*(x2 - x1) + x1;
  var b =  delta*(y2 - y1) + y1;
  setPixel(a,b)
}
x1 = 10, y1 = 100, x2 = 100, y2 = 10;
var time = Math.abs(x1 - x2);
for (var i=0; i<time; i++)  {
  var delta = i/time ;
  var a =  delta*(x2 - x1) + x1;
  var b =  delta*(y2 - y1) + y1;
  setPixel(a,b)
}


</script>
</body>

</html>
Ответить с цитированием
  #14 (permalink)  
Старый 21.12.2014, 19:02
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

JsLoveR,
Спасибо. Я нашел немного другой, он по скорости чуть чуть быстрее:

function setLine (x1, y1, x2, y2) {
    var x = x1,
        y = y1;
    var dx = Math.abs(x2-x1),
        dy = Math.abs(y2-y1);
    var sx = (x2-x1)>0?1:((x2-x1)==0?0:-1);
    var sy = (y2-y1)>0?1:((y2-y1)==0?0:-1);
    var tx, ty;
    var z, scount, count, dcount;

    if (dx>=dy) {
        tx = sx; ty = 0;
    } else {
        z=dx; dx=dy; dy=z;
        tx=0; ty=sy;
    }

    scount = 2*dy;
    count = scount-dx;
    dcount = count-dx;

    for(;;) {

        dx -= 1;

        if (dx < -1){
            break;
        }

        setPixel(x, y);

        if (count >= 0) {
            x+=sx;
            y+=sy;
            count += dcount;

        } else {
            x+=tx;
            y+=ty;
            count += scount;
        }
    }
}
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #15 (permalink)  
Старый 21.12.2014, 19:04
Профессор
Посмотреть профиль Найти все сообщения от __он_самый__
 
Регистрация: 22.11.2014
Сообщений: 130

Сообщение от Gozar
похоже на здравствуй тормоза!
этот трюк исполоьзуют например чтобы проверить находится ли курсор внутри сложной фигуры или во вне её, рисуют фигуру на невидимой канве WEBGL зеленым цветом, и проверяют какого цвета пиксель в нужной координате, белый или зеленый. и это быстре чем самому яваскриптом вычислять. Можно хоть 30 фигур нарисовать разными цветами и определить на какую наведен курсор)

эт на будущее, по скольку спускаемся на уровень абстракции ниже ближе к железу, то это раз в сто быстрее чем яваскриптом считать

Этим же трюком можно чекать пересекаются ли фигуры в физических яваскрипт движках)

аппаратное ускорение хули

Последний раз редактировалось __он_самый__, 21.12.2014 в 19:10.
Ответить с цитированием
  #16 (permalink)  
Старый 21.12.2014, 19:07
Профессор
Посмотреть профиль Найти все сообщения от __он_самый__
 
Регистрация: 22.11.2014
Сообщений: 130

for(;;)


не пиши так больше, пиши while(true) как все нормальные люди, и даже не while(1), именно while(true), как взрослый образованный человек, не дикарь.

Последний раз редактировалось __он_самый__, 21.12.2014 в 19:11.
Ответить с цитированием
  #17 (permalink)  
Старый 21.12.2014, 19:08
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

рони,
Что-то не работает:
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
</head>

<body>
<canvas id="canvas" width="1000" height="1000" style="border: 1px solid #000"></canvas>

<script>

    function setPixel (x, y) {

        ctx.beginPath();
        ctx.moveTo(x,y);
        ctx.arc(x, y, 1, 0, Math.PI*2, true);
        ctx.fill();
        ctx.closePath();
    }
var canvas = document.getElementById('canvas'),
ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgba(0,0,0,1)';

function ronyLine (x1, y1, x2, y2) {

    var time = Math.abs(x1 - x2),
        a, b, delta, i;

    for (i=0; i<time; i++)  {
      delta = i/time;
      a =  delta*(x2 - x1) + x1;
      b =  delta*(y2 - y1) + y1;
      setPixel(a,b)
    }
}
    for(var i=0;i<1000;i+=1) {
        ronyLine(10, 10, i, 200);
    }

</script>
</body>

</html>


Упс, работает, но что-то мне подсказывает, что лучше так не делать
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.

Последний раз редактировалось Gozar, 21.12.2014 в 19:11.
Ответить с цитированием
  #18 (permalink)  
Старый 21.12.2014, 19:09
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

__он_самый__,
Сообщение от __он_самый__
этот трюк исполоьзуют например чтобы проверить находится ли курсор внутри сложной фигуры или во вне её
https://developer.mozilla.org/en-US/....isPointInPath
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #19 (permalink)  
Старый 21.12.2014, 19:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

Gozar,
28 строка зачем?
Ответить с цитированием
  #20 (permalink)  
Старый 21.12.2014, 19:14
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от __он_самый__ Посмотреть сообщение
for(;;)


не пиши так больше, пиши while(true) как все нормальные люди, и даже не while(1), именно while(true), как взрослый образованный человек, не дикарь.
Можно и так. Просто код был с java списан, было не до украшательств. На скорости это не отразилось. Пусть будет while(true)
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.

Последний раз редактировалось Gozar, 21.12.2014 в 19:16.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по replace. Как заменить все точки в строке? Pluto Общие вопросы Javascript 14 21.04.2017 12:32
Получить координаты курсора в текстовом поле в пикселях prike Events/DOM/Window 4 23.05.2013 04:35
Получить все элементы YISHIMITSY Events/DOM/Window 6 19.02.2010 15:44
Получить все инпуты по заданоой маске nws Общие вопросы Javascript 2 09.09.2009 01:46
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37