2013-04-29 4 views
1

Я задал этот вопрос раньше, но не сообщил об этом ясно, поэтому простите меня за дубликат. Это должно быть лучше.Найти пересечение двух линий с постоянным наклоном и сменой координат

Мне нужно определить положение координаты, учитывая три другие координаты и 2 наклона. В принципе, точка пересечения двух линий. Тем не менее, у меня нет всей информации, доступной для решения этой проблемы.

У меня есть произвольная форма, определенная кучей вершин. Пользователь может перетаскивать линию между этими вершинами, и форма должна реагировать, как показано на диаграммах ниже.

Итак, в первом примере пользователь перетаскивает линию EF из положения слева в позицию справа (строка E2F2). Что должно произойти, так это то, что линия EF растет/сжимается, так что наклон остается неизменным и что начальные и конечные координаты остаются на линиях DE и AF соответственно. Это показано как строка E2F2.

Это должно быть достаточно общим, чтобы оно могло обрабатывать любые странные или обычные углы, которые я бросаю на него. Второй набор форм показывает более простой подход. Пользователь перетаскивает линейный CD в положение C2D2. Обратите внимание, что склоны остаются неизменными, а D2 по существу скользит вниз по диагональной линии, а B2C2 и C2D2 удлиняются по длине. В результате все 3 наклона остаются такими же, но линии B2C2 и C2D2 растут в длину, чтобы оставаться на связи, а линия D2E2 сжимается.

enter image description here

Вы должны понимать, что при перемещении линии EF, вы на самом деле движется координата «Е». Итак, первая координата проста. И предыдущий, и следующий никогда не меняются. Поэтому у меня по существу есть наклоны трех соответствующих линий и 3 из 4 необходимых координат. Мне нужен 4-й, поэтому в моем примере F2 или D2.

Этот код вызывается при событии каждый раз, когда координата перемещается. Допустим, мы перетаскиваем линию EF - тогда координата E.

  var next = this.model.get("next"), // coordinate F 
      nextNext = next.get("next"), // coordinate A 
      nextDx = nextNext.get("x") - next.get("x"), // delta X of AF 
      nextDy = nextNext.get("y") - next.get("y"), // delta Y of AF 

      prev = this.model.get("prev"), // coordinate D 
      prevDx = prev.get("x") - this.model.get("x"), // delta X of DF 
      prevDy = prev.get("y") - this.model.get("y"), // delta Y of DF 

      selfDx = next.get("x") - this.model.get("x"), // delta X of EF 
      selfDy = next.get("y") - this.model.get("y"), // delta Y of EF 

      selfX = this.initialCoords.x + this.shape.getX(), // the new position of E 
      selfY = this.initialCoords.y + this.shape.getY(), 

      selfM, selfB, prevM, prevB, nextM, nextB, m, x, y, b; 


     // check for would-be infinities 
     if (selfDx == 0) { 



      // **** THIS WHOLE BLOCK IS CORRECT **** 





      // i'm vertical 
      // we can safely assume prev/next aren't also vertical. i think? right? 

      prevM = prev.get("slope"); 
      prevB = prev.get("y") - prevM * prev.get("x"); 



      var myX = selfX, 
       myY = prevM * myX + prevB; 

      this.model.set({ 
       x: myX, 
       y: myY 
      }); 



      nextM = next.get("slope"); 
      nextB = next.get("y") - nextM * next.get("x"); 



      var nextX = selfX, 
       nextY = nextM * nextX + nextB; 

      next.set({ 
       x: nextX, 
       y: nextY 
      }); 

     } else if (selfDy == 0) { 



      //***** THIS WHOLE BLOCK IS CORRECT **** // 



      // i'm horizontal 

      if (prevDx == 0) { 
       // prev is a vertical line 
       this.model.set({ 
        y: selfY 
       }); 
      } else { 

       prevM = prev.get("slope"); 
       prevB = prev.get("y") - prevM * prev.get("x"); 

       var myY = selfY, 
        myX = (selfY - prevB)/prevM; 

       this.model.set({ 
        x: myX, 
        y: myY 
       }); 
      } 



      if (nextDx == 0) { 
       // next is a vertical line 
       next.set({ 
        y: selfY 
       }); 
      } else { 
       nextM = next.get("slope"); 
       nextB = next.get("y") - nextM * next.get("x"); 

       var nextY = selfY, 
        nextX = (selfY - nextB)/nextM; 

       next.set({ 
        x: nextX, 
        y: nextY 
       }); 
      } 
     } else { 

      // HELP HERE - you've chosen to drag an arbitrarily angled line. Figure out the "next" coordinate given the "current" one. 

      selfM = this.model.get("slope"); 
      selfB = this.model.get("y") - this.model.get("slope") * this.model.get("x"); 

      if (selfM < 0) { 

       prevM = prev.get("slope"); 
       prevB = prev.get("y") - prevM * prev.get("x"); 

       var myY = selfY, 
        myX = (selfY - prevB)/prevM; 


       // CORRECT, but need "next" position based on this 
       this.model.set({ 
        x: myX, 
        y: myY 
       }); 



      } else { 

       // CORRECT but need "next" position based on this. 
       var myX = selfX; 
       this.model.set({ 
        x: myX 
       }); 
      } 
     } 

ответ

0

У меня была похожая ситуация и имел некоторый успех, используя эту страницу в качестве справки: http://en.wikipedia.org/wiki/Line-line_intersection

Вы должны быть в состоянии перечислить все ваши испытания линии для любых точек, где они пересекают линию вашего движения. Это будут новые координаты.

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

+0

Я получил его на работу (наконец, это заняло навсегда), используя эту формулу, но с другого сайта и с некоторым вспомогательным кодом для тяжелого подъема. Но я отвечу на ваш ответ. Просто нужно немного поиграть с JS, чтобы заставить его работать. – oooyaya

+0

Спасибо! Просто подумал, что это может указывать на вас в правильном направлении - рад слышать, что вы его отсортировали. –

+0

@oooyaya вы могли бы поделиться своим JS, спасти меня заново изобретать колесо? Благодаря! – Tiago

Смежные вопросы