Touch: Add Calibration class.

Matrix transforms coordinates from digitizer to display.
This commit is contained in:
Jared Boone 2016-07-27 14:01:20 -07:00
parent 8d330784b2
commit c022a72ef4
2 changed files with 49 additions and 0 deletions

View file

@ -114,6 +114,41 @@ struct Metrics {
Metrics calculate_metrics(const Frame& frame);
struct DigitizerPoint {
int32_t x;
int32_t y;
};
struct Calibration {
/* Touch screen calibration matrix, based on article by Carlos E. Vidales:
* http://www.embedded.com/design/system-integration/4023968/How-To-Calibrate-Touch-Screens
*/
constexpr Calibration(
const std::array<DigitizerPoint, 3>& s,
const std::array<ui::Point, 3>& d
) : k { (s[0].x - s[2].x) * (s[1].y - s[2].y) - (s[1].x - s[2].x) * (s[0].y - s[2].y) },
a { (d[0].x - d[2].x) * (s[1].y - s[2].y) - (d[1].x - d[2].x) * (s[0].y - s[2].y) },
b { (s[0].x - s[2].x) * (d[1].x - d[2].x) - (d[0].x - d[2].x) * (s[1].x - s[2].x) },
c { s[0].y * (s[2].x * d[1].x - s[1].x * d[2].x) + s[1].y * (s[0].x * d[2].x - s[2].x * d[0].x) + s[2].y * (s[1].x * d[0].x - s[0].x * d[1].x) },
d { (d[0].y - d[2].y) * (s[1].y - s[2].y) - (d[1].y - d[2].y) * (s[0].y - s[2].y) },
e { (s[0].x - s[2].x) * (d[1].y - d[2].y) - (d[0].y - d[2].y) * (s[1].x - s[2].x) },
f { s[0].y * (s[2].x * d[1].y - s[1].x * d[2].y) + s[1].y * (s[0].x * d[2].y - s[2].x * d[0].y) + s[2].y * (s[1].x * d[0].y - s[0].x * d[1].y) }
{
}
ui::Point translate(const DigitizerPoint& p) const;
private:
int32_t k;
int32_t a;
int32_t b;
int32_t c;
int32_t d;
int32_t e;
int32_t f;
};
template<size_t N>
class Filter {
public: