То, что вы здесь описываете, фактически является фактором качества, который часто идет рука об руку с оценками ошибок.
Обычный способ справиться с этим — вычислить ошибку для небольшой части окружности круга. Наиболее тривиальным является определение разницы длины дуги среза круга по сравнению с отрезком, соединяющим те же две точки на окружности. Вы можете использовать более эффективные меры, такие как разница в площади, радиусе и т. д., но этот метод должен быть адекватным.
Представьте себе восьмиугольник, описанный идеальной окружностью. В этом случае ошибка представляет собой разницу в длине линии между двумя соседними точками восьмиугольника и длине дуги окружности, соединяющей эти две точки.
![введите здесь описание изображения](https://i.stack.imgur.com/o9mEq.png)
Длину дуги достаточно легко вычислить: PI * r * theta
, где r
— радиус, а theta
— угол в радианах между двумя точками, при условии, что вы проводите линии от каждой из этих точек к центру круга/многоугольника. Для замкнутого многоугольника с n
сторонами угол составляет всего (2*PI/n)
радиан. Пусть длина дуги, соответствующая этому значению n
, будет равна A
, т.е. A=2*PI*r/n
.
Длина линии между двумя точками легко вычисляется. Просто разделите свой круг на n
равнобедренных треугольников, и каждый из них на два прямоугольных треугольника. Вы знаете, что угол в каждом прямоугольном треугольнике равен theta/2 = (2*PI/n)/2 = (PI/n)
, а гипотенуза равна r
. Таким образом, вы получаете уравнение sin(PI/n)=x/r
, где x
— это половина длины отрезка, соединяющего две соседние точки на описанном вами многоугольнике. Пусть это значение будет B
(то есть: B=2x
, значит B=2*r*sin(PI/n)
).
Теперь просто вычислите относительную ошибку, E = |A-B| / A
(т.е.: |TrueValue-ApproxValue|/|TrueValue|
), и вы получите хороший небольшой процент, представленный в десятичном виде, от вашего вектора ошибки. Вы можете использовать приведенные выше уравнения, чтобы установить ограничение на E
(то есть: оно не может быть больше некоторого значения, скажем, 1,05), чтобы оно «хорошо выглядело».
Таким образом, вы можете написать функцию, которая вычисляет A
, B
и E
из приведенных выше уравнений, и выполняет цикл по значениям n
и прекращает цикл, когда вычисленное значение E
меньше вашего порога.
person
Cloud
schedule
28.08.2013