mirror of https://github.com/ArduPilot/ardupilot
139 lines
4.0 KiB
C#
139 lines
4.0 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.ComponentModel;
|
|||
|
using System.Data;
|
|||
|
using System.Drawing;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using System.Windows.Forms;
|
|||
|
|
|||
|
namespace ArdupilotMega
|
|||
|
{
|
|||
|
public partial class Camera : Form
|
|||
|
{
|
|||
|
float mm_2_feet = 1 / 304.8f;
|
|||
|
float feet_2_mm = 304.8f;
|
|||
|
const float rad2deg = (float)(180 / Math.PI);
|
|||
|
const float deg2rad = (float)(1.0 / rad2deg);
|
|||
|
|
|||
|
public Camera()
|
|||
|
{
|
|||
|
InitializeComponent();
|
|||
|
}
|
|||
|
|
|||
|
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
|
|||
|
{
|
|||
|
doCalc();
|
|||
|
}
|
|||
|
|
|||
|
void doCalc()
|
|||
|
{
|
|||
|
|
|||
|
var film_width = 36.0f;
|
|||
|
var film_height = 27.0f;
|
|||
|
var film_diag = 0.0f;
|
|||
|
|
|||
|
var flen = (float)num_focallength.Value;
|
|||
|
var flen_mult = (float)num_focalmultip.Value;
|
|||
|
var subj_dist = (float)num_agl.Value;
|
|||
|
|
|||
|
//if (isNaN(flen_mult) || flen_mult<=0)
|
|||
|
{
|
|||
|
//f.flen_mult = 1;
|
|||
|
//flen_mult = 1;
|
|||
|
}
|
|||
|
|
|||
|
// convert distance to mm
|
|||
|
/*
|
|||
|
if (f.units.value.search(/feet/i) != -1)
|
|||
|
{
|
|||
|
//user input in feet
|
|||
|
subj_dist = subj_dist * feet_2_mm;
|
|||
|
}
|
|||
|
else */
|
|||
|
{
|
|||
|
//user input in m
|
|||
|
subj_dist = subj_dist * 1000;
|
|||
|
}
|
|||
|
|
|||
|
//Account for focal length multiplier (actually, a film/sensor size multiplier)
|
|||
|
film_width = film_width / flen_mult;
|
|||
|
film_height = film_height / flen_mult;
|
|||
|
film_diag = (int)(Math.Sqrt((film_width * film_width) + (film_height * film_height)));
|
|||
|
|
|||
|
var half_fov_h = (Math.Atan(film_width / (2 * flen)));
|
|||
|
var fov_h = 2 * (subj_dist * Math.Tan(half_fov_h));
|
|||
|
|
|||
|
var half_fov_v = (Math.Atan(film_height / (2 * flen)));
|
|||
|
var fov_v = 2 * (subj_dist * Math.Tan(half_fov_v));
|
|||
|
|
|||
|
var half_fov_d = (Math.Atan(film_diag / (2 * flen)));
|
|||
|
var fov_d = 2 * (subj_dist * Math.Tan(half_fov_d));
|
|||
|
|
|||
|
//convert answer (currently in mm) back to feet
|
|||
|
fov_h = fov_h * mm_2_feet;
|
|||
|
fov_v = fov_v * mm_2_feet;
|
|||
|
fov_d = fov_d * mm_2_feet;
|
|||
|
/*
|
|||
|
if (f.units.value.search(/feet/i) != -1)
|
|||
|
{
|
|||
|
f.fov_h.value = feet_inches(fov_h);
|
|||
|
f.fov_v.value = feet_inches(fov_v);
|
|||
|
f.fov_d.value = feet_inches(fov_d);
|
|||
|
}
|
|||
|
else */
|
|||
|
{
|
|||
|
TXT_fovH.Text = meters(fov_h);
|
|||
|
TXT_fovV.Text = meters(fov_v);
|
|||
|
TXT_fovD.Text = meters(fov_d);
|
|||
|
|
|||
|
TXT_fovAH.Text = (half_fov_h * 2 * rad2deg).ToString("0.00");
|
|||
|
TXT_fovAV.Text = (half_fov_v * 2 * rad2deg).ToString("0.00");
|
|||
|
TXT_fovAD.Text = (half_fov_d * 2 * rad2deg).ToString("0.00");
|
|||
|
|
|||
|
float test1 = (float)Math.Sqrt((float)num_megapixel.Value * 1000000 * (film_height / film_width));
|
|||
|
|
|||
|
TXT_imgwidth.Text = test1.ToString("0");
|
|||
|
TXT_imgheight.Text = (((float)num_megapixel.Value * 1000000) / test1).ToString("0");
|
|||
|
|
|||
|
|
|||
|
TXT_cmpixel.Text = (((fov_h * feet_2_mm) / 10.0) / test1).ToString("0.000 cm");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//Takes a distance in feet and converts to string representation in meters/cm
|
|||
|
string meters(double aNumber)
|
|||
|
{
|
|||
|
//if (isNaN(aNumber))
|
|||
|
//return aNumber;
|
|||
|
|
|||
|
var mm = aNumber * feet_2_mm;
|
|||
|
|
|||
|
var m = Math.Floor(mm / 1000);
|
|||
|
var cm = (mm / 10) % 100;
|
|||
|
|
|||
|
return m + "m " + cm.ToString("0.00") + "cm";
|
|||
|
}
|
|||
|
|
|||
|
private void num_agl_ValueChanged(object sender, EventArgs e)
|
|||
|
{
|
|||
|
doCalc();
|
|||
|
}
|
|||
|
|
|||
|
private void num_megapixel_ValueChanged(object sender, EventArgs e)
|
|||
|
{
|
|||
|
doCalc();
|
|||
|
}
|
|||
|
|
|||
|
private void num_focallength_ValueChanged(object sender, EventArgs e)
|
|||
|
{
|
|||
|
doCalc();
|
|||
|
}
|
|||
|
|
|||
|
private void num_focalmultip_ValueChanged(object sender, EventArgs e)
|
|||
|
{
|
|||
|
doCalc();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|