2012-03-22 5 views
0

У меня есть два уравнения (расстояние и наклон формулы линии)Решить систему двух уравнений в Android/Java

д = SQRT ((х2 - х1)^2 + (у2 - у1)^2)
т = (у2 - у1)/(х2 - х1)

Известно: д, м, x1, y1
Неизвестный: х2, у2

проблема состоит в том уравнение расстояние не является линейным .. .

Есть ли способ закодировать это в java (используя Andro id совместимых библиотек) для решения? Я пробовал делать простые догадки, но это слишком медленно.

Благодаря

EDIT: Код для треугольника

 Point p1 = new Point(); 
     Point p2 = new Point(); 
     projection.toPixels(gp1, p1); 
     projection.toPixels(gp2, p2); 

     Point p3 = new Point(); 
     double slope = (p2.y - p1.y)/(p2.x - p1.x); 
     double x = 0; 
     if (p2.y - p1.y >= 0 && p2.x - p1.x >= 0) { 
      x = - Math.sqrt(600/(1 + slope*slope)) + p2.x; 
     } else if (p2.y - p1.y >= 0 && p2.x - p1.x < 0) { 
      x = Math.sqrt(600/(1 + slope*slope)) + p2.x; 
     } else if (p2.y - p1.y < 0 && p2.x - p1.x >= 0) { 
      x = - Math.sqrt(600/(1 + slope*slope)) + p2.x; 
     } else if (p2.y - p1.y < 0 && p2.x - p1.x < 0) { 
      x = Math.sqrt(600/(1 + slope*slope)) + p2.x; 
     } 
     double y = -slope*p2.x + slope*x + p2.y; 

     p3.set((int) x, (int) y); 

     double inverseSlope = 0; 
     if (slope == 0) { 
      inverseSlope = Double.MAX_VALUE; 
     } else { 
      inverseSlope = -1/slope; 
     } 

     x = -Math.sqrt(300/(1 + inverseSlope*inverseSlope)) + p3.x; 
     y = -Math.sqrt(300/(1 + inverseSlope*inverseSlope))*inverseSlope + p3.y; 

     Point p4 = new Point(); 
     p4.set((int) x, (int) y); 

     x = Math.sqrt(300/(1 + inverseSlope*inverseSlope)) + p3.x; 
     y = Math.sqrt(300/(1 + inverseSlope*inverseSlope))*inverseSlope + p3.y; 
     Point p5 = new Point(); 
     p5.set((int)x, (int) y); 
     Path path = new Path(); 
     path.moveTo(p2.x, p2.y); 
     path.lineTo(p4.x, p4.y); 
     path.moveTo(p4.x, p4.y); 
     path.lineTo(p5.x, p5.y); 
     path.moveTo(p5.x, p5.y); 
     path.lineTo(p2.x, p2.y); 
     path.moveTo(p2.x, p2.y); 
     canvas.drawPath(path, mPaint); 

Оно кажется, что в настоящее время вызвано наклоном всегда является целым, так когда < 1 это 0, не хорошо .. ,

+2

Ваш Скобки не совпадают, вы имеете в виду: SQRT ((x2 - x1)^2 + (y2 - y1)^2) * т = (y2-y1)/(x2 -x1) –

+1

, пожалуйста, не меняйте свой вопрос после принятия ответа, просто запустите новый вопрос в следующий раз ... – kritzikratzi

+1

в порядке, так что вот код, который делает то, что вы на самом деле хотите: http: //studio.sketchpad. cc/WjZ7UqIq4F , когда вы имеете дело с ориентацией в пространстве, как правило, это плохая идея использовать наклоны, потому что вам придется иметь дело со всеми углами (бесконечным и нулевым) явно в большинстве случаев. вместо этого думать в терминах векторов - то есть точек, углов и расстояний. это упростит ваши уравнения на бумаге _and_ в результате кода.если вы посмотрите на мой код, вы увидите, что он не использует ничего, кроме теоремы о пихтагорее и фундаментальном определении синуса. окончательная мысль: назовите свои переменные! – kritzikratzi

ответ

2

Пожалуйста, ознакомьтесь с ниже алгебра:

Определить

х = x2-x1

и

у = y2-y1

Тогда

м * х = y

и

д^2 = х^2 + т^2 * х^2 = (1 + т^2) * х^2

Поэтому

х = SQRT (д^2/(1 + т^2))

затем

х2 - х1 = SQRT (д^2/(1 + т^2))

так

х2 = SQRT (д^2/(1 + т^2) + x1

Аналогично

у = SQRT (д^2/(1 + т^2)) * м

у2 = SQRT (д^2/(1 + т^2)) * м + у1

Так что ответ:

х2 = SQRT (д^2/(1 + т^2)) + x1

y2 = sqrt (d^2/(1 + m^2)) * м + y1

+0

Выглядит хорошо .. Большое спасибо! – user1154920

2

«Библиотека» вы ищете называется математике :)

вы можете спросить Wolfram Alpha: http://www.wolframalpha.com/input/?i=solve+d+%3D+sqrt%28+%28x2+-+x1%29%5E2+%2B+%28y2+-+y1%29%5E2+%29%2C+m+%3D+%28y2+-+y1%29+%2F+%28x2+-+x1%29+over+the+reals (не спрашивайте меня, почему она знает х2 и у2 interresting)

вы можете делать такие вещи вручную, но будьте очень осторожны, чтобы не уронить знаки. даже несмотря на то, что этот материал преподается в школе, они мало уважают детали. обратите внимание, что в этом случае есть два возможных решения, и вам нужно убедиться, что d> 0 во всех случаях!

First solution Second solution

+0

Так что в основном я использую эти формулы для рисования треугольника: я отредактировал свой вопрос, чтобы показать код, который я использую для его рисования. Он хорошо рисует, за исключением того, что наклон линии меньше определенной суммы, тогда треугольник не рисуется. Любые идеи, почему треугольник не рисуется? – user1154920

+1

хорошо, есть проблемы с кодом. попробуйте эту интерактивную версию, чтобы увидеть, что я имею в виду: http://studio.sketchpad.cc/WjZ7UqIq4F. проблема заключается в том, что наклон плохо определен, если x-координаты линии вверх, потому что вы в основном делите на ноль. (я опубликую что-нибудь конструктивное за секунду) – kritzikratzi

+0

Извините, что не публиковал новый вопрос - и я заметил это и исправил его, но наклон равен 0, когда на самом деле наклон похож на 0.9. Я предполагаю из-за точности. – user1154920

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