1. JavaScript / Говнокод #9390

    +166

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    if (
    		(((a[0][0] < a[1][0] && (x >= a[0][0] && x <= a[1][0])) ||
    		(a[0][0] > a[1][0] && (x <= a[0][0] && x >= a[1][0]))) &&
    		((b[0][0] < b[1][0] && (x >= b[0][0] && x <= b[1][0])) ||
    		(b[0][0] > b[1][0] && (x <= b[0][0] && x >= b[1][0])))) ||
    		(a[0][0] == a[1][0] && ((a[0][1] < a[1][1] && (y >= a[0][1] && y <= a[1][1])) ||
    								(a[0][1] > a[1][1] && (y <= a[0][1] && y >= a[1][1])))
    		) || (
    		b[0][0] == b[1][0] && ((b[0][1] < b[1][1] && (y >= b[0][1] && y <= b[1][1])) ||
    								(b[0][1] > b[1][1] && (y <= b[0][1] && y >= b[1][1])))
    		)) {
    			return [x, y];
    	} else {
    		return false;
    	}

    Запостил: akim, 11 Февраля 2012

    Комментарии (17) RSS

    • условный оператор проверяет принадлежит ли точка x, y отрезку a и b
      Ответить
    • Я не верю, что человек способен написать такой код
      Ответить
      • способен
        Ответить
        • Это какой то машино-орентированный человек
          Ответить
          • Да наверное нашел в справочнике формулу и подставил значения - как получилось, так получилось. Вряд ли сам догадался, если бы сам, то наверняка код по-другому выглядел.
            Ответить
    • сперва увидел кучу скобок и подумал, что это лисп
      Ответить
    • а вот так выглядит полностью функция нахождения точки пересечения двух отрезков
      function linecross (v1, r1, v2, r2, v3, r3, v4, r4) {
      	var a = [[v1, r1], [v2, r2]];
      	var b = [[v3, r3], [v4, r4]];
      	var x, y, k1, k2, a1, a2;
      	if (a[0][0] > a[1][0]) {
      		x = a[1][0];
      		y = a[1][1];
      		a[1][0] = a[0][0];
      		a[1][1] = a[0][1];
      		a[0][0] = x;
      		a[0][1] = y;
      	}
      	if (b[0][0] > b[1][0]) {
      		x = b[1][0];
      		y = b[1][1];
      		b[1][0] = b[0][0];
      		b[1][1] = b[0][1];
      		b[0][0] = x;
      		b[0][1] = y;
      	}
      	if (a[0][0] > b[0][0]) {
      		x = b;
      		b = a;
      		a = x;
      	}
      	if (a[0][0] > b[1][0] || b[1][0] > a[1][0] &&
      		a[0][0] > b[0][0] || b[0][0] > a[1][0]) {
      		return false;
      	}
      	if (a[0][1] == a[1][1]) {
      		k1 = 0;
      	} else {
      		k1 = (a[1][1] - a[0][1]) / (a[1][0] - a[0][0]);
      	}
      	if (b[0][1] == b[1][1]) {
      		k2 = 0;
      	} else {
      		k2 = (b[1][1] - b[0][1]) / (b[1][0] - b[0][0]);
      	}
      	if (k1 == k2) {
      		return false;
      	}
      	if (a[0][0] == a[1][0]) {
      		a2 = b[0][1] - (k2 * b[0][0]);
      		x = a[0][0];
      		y = a2 + (k2 * x);
      	} else if (b[0][0] == b[1][0]) {
      		a1 = a[0][1] - (k1 * a[0][0]);
      		x = b[0][0];
      		y = a1 + (k1 * x);
      	} else {
      		a1 = a[0][1] - (k1 * a[0][0]);
      		a2 = b[0][1] - (k2 * b[0][0]);
      		x = (a1 - a2) / (k2 - k1);
      		y = a2 + (k2 * x);
      	}
      
      	if (
      		(((a[0][0] < a[1][0] && (x >= a[0][0] && x <= a[1][0])) ||
      		(a[0][0] > a[1][0] && (x <= a[0][0] && x >= a[1][0]))) &&
      		((b[0][0] < b[1][0] && (x >= b[0][0] && x <= b[1][0])) ||
      		(b[0][0] > b[1][0] && (x <= b[0][0] && x >= b[1][0])))) ||
      		(a[0][0] == a[1][0] && ((a[0][1] < a[1][1] && (y >= a[0][1] && y <= a[1][1])) ||
      								(a[0][1] > a[1][1] && (y <= a[0][1] && y >= a[1][1])))
      		) || (
      		b[0][0] == b[1][0] && ((b[0][1] < b[1][1] && (y >= b[0][1] && y <= b[1][1])) ||
      								(b[0][1] > b[1][1] && (y <= b[0][1] && y >= b[1][1])))
      		)) {
      			return [x, y];
      	} else {
      		return false;
      	}
      	return false;
      }
      Ответить
      • Бить по пальцам учебником геометрии.
        Ответить
      • Пиздец, нахуй разбирать столько случаев, они ж друг от друга не отличаются, если делать не через жопу.
        Если знать только kx+b и крамера, то да, будет херово.
        Ответить
      • Тут как бы не только геометрия... я думал, что массивы где-то используются как массивы - но зачем он(а) их создал(а) - это ж вообще не понятно. Просто на ровном месте самому себе в два раза работу увеличить... :/
        Ответить
    • единственное что не учитывает эта функция это если прямые отрезков совподают)
      Ответить
    • > a[0][0] < a[1][0] && (x >= a[0][0] && x <= a[1][0])

      Это уже говнокод
      Ответить

    Добавить комментарий