How close is that to what we EXPECT to see?
Common sense
should tell you that, because of the enormous size of the Earth compared to our view, we would expect the visible curvature to still be very slight, even at 100,000 feet, especially with a more narrow Field of View as shown when we crop this image:

What we need to do is calculate is how much of a visual 'bump' the peak of our horizon should have over where the horizon meets the edge of the frame given our estimated altitude of 100,000', camera horizontal Field of View of 94.4°, and an image 1920 pixels across.
But why is there a visual bump anyway?
Perspective
One thing we know from the study of Perspective is that a circle, when viewed at angle other than 90°, is going to appear as an ellipse that is more and more 'smushed' the steeper the angle at which we view it. Viewed on edge from the middle it's going to look 'flatter and flatter'.
In our case we are in the middle of this circle and we're viewing the edge at an angle of about 5.6° at this altitude, so it's going to be very squished, but it would still have a definite bump in the middle.
And to find that we need..
Geometry
NOTE: we are using a spherical approximation of the Earth and ignoring atmospheric refraction in order to make our calculations manageable. But this means that for larger heights our estimates will diverge slightly from actual observations. Not by very much but keep in mind there is a small margin of error here as Earth's Radius will be slightly different by location, but it only varies by ~0.34%. I am also not using the same method as the Lynch paper as I could not find his equation for X at the time of this writing, I get only very slightly different results from Lynch using this approach. So to be clear, this method here is only a way to get a Very Good approximation of what you would expect to see, not a perfect calculation.To help us get our geometry and nomenclature down I made some diagrams.
We are at point
O (the observer) at about h=100000' (~18.9 miles) above an Earth with a radius R of about 3959 miles. When we look out to a point just tangent on the surface of the Earth, our horizon peak at point
P will appear "a little higher" in our field of vision than the edges of the horizon do, at points
B/C. This is easy to tell because we can draw a line from point
OP and
OK and there is clearly an angle between them. Point
G is ground-level and point
A is the center of our horizon circle.
Because line D is a tangent we know that it forms a right angle with the center of our sphere, this allows us to easily calculate all the distances and angles involved:
 |
| Figure 3. NOTE: 100,000' would only be ~2 pixels high at this scale! As shown, h is ~900 miles up. |
Here is our view from above (this one is to scale), showing the horizon circle in green, the edges of the horizon at points
B & C, and the distance
KP is our horizon circle
Sagitta:
 |
| Figure 4. Overhead View of Horizon Circle - in GeoGebra |
And here are the calculations from my
GeoGebra Calculator showing the side view:
 |
| Figure 5. Side View of Geometry - in GeoGebra |
So in an ideal rectilinear lens we would expect to see approximately 41 pixels between the edges of our horizon circle (points
B & C) and our horizon peak (at point
P).
This is very good agreement with the image above where we have ~38±2 pixels using the Curvilinear lens which has slightly squished our curvature.
The Math
In this section we will look in detail at the mathematics for the above geometry and we will use this to then estimate what we expect to see in our camera.
We are given only a few values to start with but we can find all the rest using just the
Pythagorean theorem using our two right triangles. After that we will step through the projection and calculate how many pixels we should observe which requires us to map our view into a 2D frame like our picture is. If you need help with some of the right triangle formulas here you can use this
Right Triangle Calculator which will explain it in more detail (remember to put the 90° angle in the correct position and select the element you want to solve for).
So here are the solutions to the various line segments in our diagram. These are all fairly straight forward right triangle solutions. We mainly need D, H, & Z which we get from simple geometry. I've included some of the other calculations for reference only. Values for a, p, h, and R are given values.
| Variable | Equation | Value | Description |
|---|
| a | 94.4° | 94.4° / 1.647591 rad | Horizontal Field of View |
| p | 1920 pixels | 1920 pixels | Horizontal Resolution (pixels) |
| h | 100000 ft | 18.9394 mi | Observer Height (in miles) |
| R | 3959 mi | 3959 mi | Earth Radius (approximate) |
| ß | asin(R/(h+R)) | 84.408° / 1.4732 rad | angle at XOD (90°-ß) is angle from level to horizon point P |
| D | sqrt(h*(h+2*R)) | 387.7123 mi | distance to the horizon (OP) |
| Z | (D*R)/(h+R) | 385.8664 mi | radius of horizon circle also AP = D*sin(β); (((sqrt(h*(h+2*R)))*R)/(h+R)) |
| S | (h*R)/(h+R) | 18.8492 mi | distance to horizon plane from Ground also AG = R-sqrt(R²-Z²)) |
| H | S+h | 37.7886 mi | Observer Height above horizon plane also OA = D*cos(β); (((h*R)/(h+R))+h) |
| S₁ | Z*(1-cos(a/2)) | 123.6928 mi | height of the chord made by BC is given by KP, this is where our Field of View is used to find point K |
u Horizon Dip | atan(H/Z) | 5.593° | angle from level to point P (this is the angle for OP, from slope of H over Z, also 90°-ß) |
| Chord Dip | atan(H/(Z-S₁)) | 8.202° | angle from level to point K (also atan(H/(Z*cos(a/2))), again, angle for the slope of OK) |
| Horizon Sagitta Angle | |Chord Dip-Horizon Dip| | 2.6086° | True/geometric angle between horizon peak and edges |
| Sagitta Pixel Height | *discussed below | ~40 pixels | Estimate in pixels |
So event at 100,000' our horizon is a mere 386 mile radius circle and we're just 19 miles above the center. So we are still only seeing a fraction of the Earth at a fairly slight angle, even from 100,000'. And a large portion of that distant horizon is actually compressed by perspective and tilted to our viewpoint, making it virtually impossible to see. The majority of the visible area where you can make anything out is considerably smaller than the full horizon distance.
Given this configuration we should then expect to see only a 2.6° difference between the horizon peak and the line formed between the edges of the horizon. That is slight but measurable.
But now we want to know if this matches our image.
3D Projection
Since we want to compare this to our photograph (Sagitta Pixel Height) we also need to know how many pixels high that is and this is where things get a little bit tricky.
We will run through this process twice. The first time looking straight out and the second time we will rotate our view to look slightly down directly toward our horizon peak (P) which is fractionally more accurate for the image we are looking at but also more complex.
For our 3D to 2D projection we can take 3D coordinates [x,y,z] and transform them by dividing x and y by the z value [x/z, y/z] which projects onto the plane z=1. We can show that this preserves straight lines by considering two points [0,100,100],[50,100,100] which trivially transform into [0,1],[0.5,1] - so we can see they remain along the same y value, therefore remain in a straight line - we've simply scaled them down proportional to their distance (which is how perspective works).
Geometrically, think about being in the middle of 4 equally spaced parallel lines which run out in front of you, as the distance (z) increases the points at different z values would simply get closer and closer to the center in the 2D projection. It is easy to see how [x/z, y/z] accomplishes this.
The second step then is finding the 'edge' of our frame. Since we know our Field of View (FOV) we can find that by locating the x-axis extent of a point lying along our Field of View (conveniently provided by finding the edge of our horizon).
We make the origin be our camera at [0,0,0] and we are looking out parallel to the plane of our horizon circle along the z-axis (towards [0,0,1]) and our axes are oriented as follows:
x-axis = left(-)/right(+)
y-axis = up(-)/down(+)
z-axis = behind(-)/forward(+)
Locating our Points
Our horizon peak (P) is therefore found directly ahead (x=0), down at the horizon circle plane (y=H), and at a distance Z from our camera. This is not the total distance (D) from camera to point P but rather only the z-axis distance (Z).
P = [0, H, Z]
Which projects into 2D as:
P" = [0/Z, H/Z]
P" = [0, H/Z]
So far, very simple.
Where is point B? It is to the right at 1/2 the FOV angle (a/2) on our horizon circle. We can convert an angle and distance (radius of our horizon circle = Z) into coordinates using x=Z*sin(a/2), z=Z*cos(a/2), and of course our y value is the same as P, in the plane of the horizon circle at y=H. Here is a diagram showing our horizon circle and where the points are located on it.
 |
| Figure 6. Overhead View of Horizon Circle with Equations for Dimensions |
This places Point B at
B = [Z*sin(a/2), H, Z*cos(a/2)]
and we again divide x & y by z to project into the 2D plane:
B" = [(Z*sin(a/2))/(Z*cos(a/2)), H/(Z*cos(a/2))]
Finding the y-axis delta
Now that we have both of our points mapped into 2D coordinates:
P" = [0, H/Z]B" = [(Z*sin(a/2))/(Z*cos(a/2)), H/(Z*cos(a/2))]
we just need to find the vertical (y-axis) difference between the 2D y-axis values, which is simply:
Δy = |y₁ - y₀|
Δy = [H/(Z*cos(a/2))] - [H/Z]
Simplified:
Δy = H/Z * (1/cos(a/2)-1)
We can also reduce the expression H/Z into terms of h and R by substitution:
H/Z = (S+h) / ((D*R)/(h+R))
Finding the Frame
Next we need to find the extents of our frame. Since the edge of the horizon is also the edge of our photo that rightmost point that gives us our greatest x extent, and we need to double that (to account for the left side) - we then divide by this quantity to scale our Δy value into a ratio of the whole frame. So 2 times the x value of B"" would be:
2*(Z*sin(a/2))/(Z*cos(a/2))
The Z cancels out leaving us with:
2*(sin(a/2))/(cos(a/2))
So we can now divide Δy by this extent value so we get a ratio
D/R * (tan(a/4)/2)
Find the Pixels
We finally only need to multiply our ratio by the number of horizontal pixels (assuming the pixels are square, or you would need to adjust for the pixel ratio) to give our final value
Sagitta Pixel Height = p * D/R * (tan(a/4)/2) = 41.07
Therefore, in an undistorted, rectilinear 1920 pixel horizontal resolution image with a Field of View of 94.4° we should expect to see approximately 41 pixels of curvature from 100,000'.
Already very close, but we're looking right at the Horizon rather that straight-out. Does that change our calculation? Well, yes, but only a little bit because in tilting the camera we've slightly change the point on the horizon which hits the edge of our frame.
Rotated Coordinates
Now let's tilt our camera down so it points right at the horizon peak (P). To do this we will need to rotate our coordinates by our Horizon Dip angle along our x-axis (x coordinates remain unchanged but y and z should rotate) so that point P becomes directly ahead [0, 0]. Then we can repeat the calculations above.
The rotational matrix multiplication for x-axis rotation is:
⎡x⎤ ⎡ 1 0 0 ⎤
Given an angle u the equations to transform x, y, and z coordinates are:
x' = x
y' = y*cos(u) - z*sin(u)
z' = y*sin(u) + z*cos(u)
Since we are 'looking down' we need to rotate 'up' so our angle will be positive and equal to Horizon Dip to bring
P right into the center of our frame at [0,0].
Our point
P starts at [0, H, Z] and we need to rotate point
P to be straight ahead, so our u angle:
u = atan(H/Z) = atan(D/R)x' = 0y' = H*cos(u) - Z*sin(u) = 0z' = H*sin(u) + Z*cos(u) = DP' = [0, 0, D]and project into 2D:
P" = [0/D, 0/D]P" = [0, 0]That was easy because the rotation exactly cancels out the previous H/Z slope. But it's a good check that our rotation was in the desired direction.
And next we need to rotate point
B, we start out in the same place as before (
this introduces a small error because our rotated FOV would intersect the horizon circle at a slightly different point, I'm assuming a small rotation so the error is negligible and we can ignore this term).
B = [Z*sin(a/2), H, Z*cos(a/2)]And we rotate by matrix multiplication, for our small angles the cos(u) term will the majority of the value, and we shift a tiny bit into sin(u).
x' = Z*sin(a/2)y' = H*cos(u) - (Z*cos(a/2))*sin(u)z' = H*sin(u) + (Z*cos(a/2))*cos(u)
B' = [Z*sin(a/2), H*cos(u)-(Z*cos(a/2))*sin(u), H*sin(u)+(Z*(cos(a/2))*cos(u)]and project into 2D by dividing x and y by z:
B" = [(Z*sin(a/2))/(H*sin(u)+(Z*(cos(a/2))*cos(u)), (H*cos(u)-(Z*cos(a/2))*sin(u))/(H*sin(u)+(Z*(cos(a/2))*cos(u))]This is why you need special video cards to play games at high frame rates... and we've only rotated one axis.
Since point P's y value is 0 our Δy is therefore just our y value from B":
H*cos(u) - (Z*cos(a/2))*sin(u)
Δy = -------------------------------
H*sin(u) + (Z*cos(a/2))*cos(u)
Divide Δy by 2 times B" rotated x-extent (x/z) to get our ratio (I multiply by the inverse here):
H*cos(u) - (Z*cos(a/2))*sin(u) H*sin(u)+(Z*(cos(a/2))*cos(u)
------------------------------ * -----------------------------
H*sin(u) + (Z*cos(a/2))*cos(u) 2*Z*sin(a/2)
The first denominator and the second numerator cancel out leaving:
H*cos(u) - (Z*cos(a/2))*sin(u)
------------------------------
2*Z*sin(a/2)
and multiply by our horizontal pixel count to scale back to pixels, giving our formula:
H*cos(u)-(Z*cos(a/2))*sin(u)
Sagitta Pixel Height = p * ----------------------------
2*Z*sin(a/2)
In this case we get 40.9 pixels.
With the details of the lens "fish-eye" or curvilinear properties we could further transform our image to match more exactly. Since the horizon is near the center of the lens the distortion should be slight and working against the visible curvature I'll leave the lens correction as an exercise for the reader. The simplest method would be process the image using the Lightroom/Photoshop plugins that can do the lens correction automatically and then just measure the pixels.
Conclusion
Because the horizon is at or below the center line, which would flatten the curvature not exaggerate it, we can easily be certain that this footage shows that the horizon is convexly curved. We have also calculated what we would expect to see under ideal conditions and find a good match with our observation once we account for the actual lens distortions.
We can see that our lens, altitude, and FOV are all very important to figuring out what we
expect to see and knowing what to expect is critical in evaluating what we actually see - especially through the eye of a camera lens. And that just because the camera image has some distortion it doesn't mean the photo tells us nothing about the scene. Indeed, this image very clearly shows the curvature despite the distortion working against it.
If you want to measure the curvature you have to be very careful and pretty high up.
And while 35,000' sounds pretty high up, here is what that looks like: