Вы также можете попробовать интерпретатор BeanShell :
Interpreter interpreter = new Interpreter();
interpreter.eval("result = (7+21*6)/(32-27)");
System.out.println(interpreter.get("result"));
где P является точкой, C является центром, и R является радиусом на подходящем "mathy" языке:
V = (P - C); Answer = C + V / |V| * R;
, где |V | является длиной V.
хорошо, OK
double vX = pX - cX;
double vY = pY - cY;
double magV = sqrt(vX*vX + vY*vY);
double aX = cX + vX / magV * R;
double aY = cY + vY / magV * R;
, легкий расширяться на> 2 размера.
я сделал бы строку от центра до точки и calc, где тот график пересекает круг oO, я думаю не так трудный
Решите его математически сначала, затем переведите в код. Помните, что самая короткая строка между точкой и краем круга также пройдет через свой центр (как указано @litb).
Аккуратные функции, умножьтесь r и добавьте пкс или pY как соответствующих.
Рассматривайте центр проспекта как Ваш источник, преобразуйте координаты (пкс, pY) к полярным координатам, (тета, r') заменяют r' r исходного круга и преобразовывают назад в декартовы координаты (и корректируются для источника).
Вы попросили самый короткий код, таким образом, здесь это. В четырех строках это может быть сделано, хотя существует все еще квадратичное. Я рассмотрел вопрос, чтобы быть вне круга. Я не рассмотрел то, что происходит, если точка непосредственно выше или ниже центра круга, который является cX=pX.
m=(cY-pY)/(cX-pX); //slope
b=cY-m*cX; //or Py-m*Px. Now you have a line in the form y=m*x+b
X=( (2mcY)*((-2*m*cY)^2-4*(cY^2+cX^2-b^2-2*b*cY-r^2)*(-1-m^2))^(1/2) )/(2*(cY^2+cX^2-b^2-2*bc*Y-r^2));
Y=mX+b;
1] Получают уравнение для строки, соединяющей точку и центр круга.
2] Проходят строка расстояние одного радиуса от центра для нахождения точки на круге. Это: radius=a^2+b^2, который является: r = (cY-Y) + (cX-X)), ^ (1/2)
3] Решают квадратично. X=quadratic_solver (r = (cY-Y) + (cX-X)) ^ (1/2), X) который, если Вы занимаете место в Y=m*X+b, Вы получаете тот ад выше.
4] X и Y являются Вашими результатами на круге.
я довольно уверен, что совершил ошибку где-нибудь, оставьте комментарий, если кто-либо находит что-то. Конечно, это является вырожденным, один ответ является самым далеким от Вашей точки, и другой является самым близким.
Простой способ думать об этом с точки зрения изображения, и легкий превратиться в код: Возьмите вектор (пкс - cX, pY - cY) от центра до точки. Разделитесь на его длину sqrt (и тому подобное), умножьтесь радиусом. Добавьте это к (cX, cY).