문제

2017-03-21 16 views
0

10^3로 구성된 2 차원 그래프를 그릴 필요가 (실질적으로 5*10^6까지 도달 할 수) 포인트문제

샘플 포인트 :

x, and f(x) 따라서, 플롯에 매우 비 편안 범위에 알 수 있듯이
  x    y = f(x) 
----------------------------------------- 
0.0000000000000e+000 9.9453146383711e+006 
1.0107375000000e-002 1.0053545400632e+007 
2.0211374000000e-002 9.9475746573179e+006 
3.0315250000000e-002 1.0051184341654e+007 
4.0418752000000e-002 9.9500284997072e+006 
5.0525375000000e-002 1.0048588691478e+007 
6.0629874000000e-002 9.9527328766918e+006 
7.0733748000000e-002 1.0045819834233e+007 
8.0837503000000e-002 9.9556071710602e+006 
... 

,

나는 다른한 범위 [a, b]에서 변환하는 기능을 썼다 특정 크기 (w=780h=550)와 사각형 영역에서 전체 그래프를 플롯하기 위해 7,273,210은

// mapping x from [a, b] to [c, d] 
qreal Graph::mapTo(qreal x, qreal a, qreal b, qreal c, qreal d) 
{ 
    qreal denom = b - a; 

    if (denom != 0.0f) 
    { 
     return (x - a)*(d - c)/denom + c; 
    } 

    return 0.0f; 
} 
//... 
qreal x1 = mapTo(points[i].x(), 0, maxX, 0, w); 
qreal y1 = mapTo(points[i].y(), minY, maxY, 0, h); 

qreal x2 = mapTo(points[i+1].x(), 0, maxX, 0, w); 
qreal y2 = mapTo(points[i+1].y(), minY, maxY, 0, h); 

그러나이 변환 큰 정확성 후

은 ... 잃어버린 나는 직선 결과 값의이 종류를 가지고 .. 음모를 꾸미고 후 (대신 곡선의) 수평 라인

x = 0   y = 549.453 
x = 0.762673 y = 549.447 
x = 1.52509 y = 549.453 
x = 2.2875 y = 549.447 
x = 3.04988 y = 549.453 
x = 3.8125 y = 549.447 
x = 4.57496 y = 549.453 
x = 5.33736 y = 549.447 
x = 6.09976 y = 549.452 

y 값이 너무 많이 정확도 ISN을 잃은 것 같은 몇 가지 실수가 컴퓨터에 floating point를 arithmetics로 표현하지만,이 경우에 보인다되지 않을 수 있다는 사실을 알고 ' 그것?

무엇이 그 값의 원인입니까?

이 경우 수학 연산 간의 정확성을 위해 어떤 알고리즘을 사용해야합니까?

+0

는'qreal' 무엇입니까? 'denom! = 0.0f' - 분모가 0에 가까우면 여전히 문제가 있습니다. – PaulMcKenzie

+1

@PaulMcKenzie'qreal'은'double '에 대한 typedef 인'Qt' 출신입니다 – ampawd

+0

@PaulMcKenzie 님이 당신의 문제에 대해 이야기합니까? – ampawd

답변

0

자사가 minY을 발견 할 필요가 y

올바르게 범위 [0, h]에 매핑하는 maxY y을위한 초 동안 같은 정확하지 않고 결과를주는 이유를 적어도 발견 - 더 2D처럼 보이는되었다이 그래프를 수정 한 후 일부 기능의 그래프.

이제 또 다른 문제가있다 : 점의 수 (100 만) 렌더링이 매우 느리게 도착 높은 경우 ...