mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 21:00:05 +00:00
Add ticks to linked vectors
This commit is contained in:
parent
cd1547f573
commit
a0701df13f
3 changed files with 120 additions and 9 deletions
|
|
@ -69,6 +69,10 @@ public:
|
|||
|
||||
std::vector<std::shared_ptr<LinkedVectorDrawItem>> vectorList_ {};
|
||||
std::shared_ptr<GeoLines> geoLines_;
|
||||
|
||||
bool ticksEnabled_ {false};
|
||||
units::length::nautical_miles<double> tickRadius_ {1.0};
|
||||
units::length::nautical_miles<double> tickRadiusIncrement_ {1.0};
|
||||
};
|
||||
|
||||
LinkedVectors::LinkedVectors(std::shared_ptr<GlContext> context) :
|
||||
|
|
@ -179,14 +183,19 @@ void LinkedVectors::FinishVectors()
|
|||
{
|
||||
for (auto& di : p->vectorList_)
|
||||
{
|
||||
auto tickRadius = p->tickRadius_;
|
||||
|
||||
for (std::size_t i = 0; i < di->coordinates_.size() - 1; ++i)
|
||||
{
|
||||
auto borderLine = p->geoLines_->AddLine();
|
||||
|
||||
const double& latitude1 = di->coordinates_[i].latitude_;
|
||||
const double& longitude1 = di->coordinates_[i].longitude_;
|
||||
const double& latitude2 = di->coordinates_[i + 1].latitude_;
|
||||
const double& longitude2 = di->coordinates_[i + 1].longitude_;
|
||||
const common::Coordinate& coordinate1 = di->coordinates_[i];
|
||||
const common::Coordinate& coordinate2 = di->coordinates_[i + 1];
|
||||
|
||||
const double& latitude1 = coordinate1.latitude_;
|
||||
const double& longitude1 = coordinate1.longitude_;
|
||||
const double& latitude2 = coordinate2.latitude_;
|
||||
const double& longitude2 = coordinate2.longitude_;
|
||||
|
||||
GeoLines::SetLineLocation(
|
||||
borderLine, latitude1, longitude1, latitude2, longitude2);
|
||||
|
|
@ -197,6 +206,36 @@ void LinkedVectors::FinishVectors()
|
|||
GeoLines::SetLineHoverText(borderLine, di->hoverText_);
|
||||
|
||||
di->borderDrawItems_.emplace_back(std::move(borderLine));
|
||||
|
||||
if (p->ticksEnabled_)
|
||||
{
|
||||
auto angle = util::GeographicLib::GetAngle(
|
||||
latitude1, longitude1, latitude2, longitude2);
|
||||
auto angle1 = angle + units::angle::degrees<double>(90.0);
|
||||
auto angle2 = angle - units::angle::degrees<double>(90.0);
|
||||
|
||||
auto tickCoord1 = util::GeographicLib::GetCoordinate(
|
||||
coordinate2, angle1, tickRadius);
|
||||
auto tickCoord2 = util::GeographicLib::GetCoordinate(
|
||||
coordinate2, angle2, tickRadius);
|
||||
|
||||
const double& tickLat1 = tickCoord1.latitude_;
|
||||
const double& tickLon1 = tickCoord1.longitude_;
|
||||
const double& tickLat2 = tickCoord2.latitude_;
|
||||
const double& tickLon2 = tickCoord2.longitude_;
|
||||
|
||||
auto tickBorderLine = p->geoLines_->AddLine();
|
||||
|
||||
GeoLines::SetLineLocation(
|
||||
tickBorderLine, tickLat1, tickLon1, tickLat2, tickLon2);
|
||||
|
||||
GeoLines::SetLineModulate(tickBorderLine, kBlack);
|
||||
GeoLines::SetLineWidth(tickBorderLine, di->width_ + 2.0f);
|
||||
GeoLines::SetLineVisible(tickBorderLine, di->visible_);
|
||||
GeoLines::SetLineHoverText(tickBorderLine, di->hoverText_);
|
||||
|
||||
tickRadius += p->tickRadiusIncrement_;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -204,14 +243,19 @@ void LinkedVectors::FinishVectors()
|
|||
// Generate geo lines
|
||||
for (auto& di : p->vectorList_)
|
||||
{
|
||||
auto tickRadius = p->tickRadius_;
|
||||
|
||||
for (std::size_t i = 0; i < di->coordinates_.size() - 1; ++i)
|
||||
{
|
||||
auto geoLine = p->geoLines_->AddLine();
|
||||
|
||||
const double& latitude1 = di->coordinates_[i].latitude_;
|
||||
const double& longitude1 = di->coordinates_[i].longitude_;
|
||||
const double& latitude2 = di->coordinates_[i + 1].latitude_;
|
||||
const double& longitude2 = di->coordinates_[i + 1].longitude_;
|
||||
const common::Coordinate& coordinate1 = di->coordinates_[i];
|
||||
const common::Coordinate& coordinate2 = di->coordinates_[i + 1];
|
||||
|
||||
const double& latitude1 = coordinate1.latitude_;
|
||||
const double& longitude1 = coordinate1.longitude_;
|
||||
const double& latitude2 = coordinate2.latitude_;
|
||||
const double& longitude2 = coordinate2.longitude_;
|
||||
|
||||
GeoLines::SetLineLocation(
|
||||
geoLine, latitude1, longitude1, latitude2, longitude2);
|
||||
|
|
@ -227,6 +271,41 @@ void LinkedVectors::FinishVectors()
|
|||
}
|
||||
|
||||
di->lineDrawItems_.emplace_back(std::move(geoLine));
|
||||
|
||||
if (p->ticksEnabled_)
|
||||
{
|
||||
auto angle = util::GeographicLib::GetAngle(
|
||||
latitude1, longitude1, latitude2, longitude2);
|
||||
auto angle1 = angle + units::angle::degrees<double>(90.0);
|
||||
auto angle2 = angle - units::angle::degrees<double>(90.0);
|
||||
|
||||
auto tickCoord1 = util::GeographicLib::GetCoordinate(
|
||||
coordinate2, angle1, tickRadius);
|
||||
auto tickCoord2 = util::GeographicLib::GetCoordinate(
|
||||
coordinate2, angle2, tickRadius);
|
||||
|
||||
const double& tickLat1 = tickCoord1.latitude_;
|
||||
const double& tickLon1 = tickCoord1.longitude_;
|
||||
const double& tickLat2 = tickCoord2.latitude_;
|
||||
const double& tickLon2 = tickCoord2.longitude_;
|
||||
|
||||
auto tickGeoLine = p->geoLines_->AddLine();
|
||||
|
||||
GeoLines::SetLineLocation(
|
||||
tickGeoLine, tickLat1, tickLon1, tickLat2, tickLon2);
|
||||
|
||||
GeoLines::SetLineModulate(tickGeoLine, di->modulate_);
|
||||
GeoLines::SetLineWidth(tickGeoLine, di->width_);
|
||||
GeoLines::SetLineVisible(tickGeoLine, di->visible_);
|
||||
|
||||
// If the border is not enabled, this line must have hover text
|
||||
if (!p->borderEnabled_)
|
||||
{
|
||||
GeoLines::SetLineHoverText(tickGeoLine, di->hoverText_);
|
||||
}
|
||||
|
||||
tickRadius += p->tickRadiusIncrement_;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -92,6 +92,23 @@ GetAngle(double lat1, double lon1, double lat2, double lon2)
|
|||
return units::angle::degrees<double> {azi1};
|
||||
}
|
||||
|
||||
common::Coordinate GetCoordinate(const common::Coordinate& center,
|
||||
units::angle::degrees<double> angle,
|
||||
units::length::meters<double> distance)
|
||||
{
|
||||
double latitude;
|
||||
double longitude;
|
||||
|
||||
DefaultGeodesic().Direct(center.latitude_,
|
||||
center.longitude_,
|
||||
angle.value(),
|
||||
distance.value(),
|
||||
latitude,
|
||||
longitude);
|
||||
|
||||
return {latitude, longitude};
|
||||
}
|
||||
|
||||
common::Coordinate GetCoordinate(const common::Coordinate& center,
|
||||
units::meters<double> i,
|
||||
units::meters<double> j)
|
||||
|
|
|
|||
|
|
@ -49,13 +49,28 @@ bool AreaContainsPoint(const std::vector<common::Coordinate>& area,
|
|||
units::angle::degrees<double>
|
||||
GetAngle(double lat1, double lon1, double lat2, double lon2);
|
||||
|
||||
/**
|
||||
* Get a coordinate from a polar coordinate offset.
|
||||
*
|
||||
* @param [in] center The center coordinate from which the angle and distance
|
||||
* are given
|
||||
* @param [in] angle The angle at which the destination coordinate lies
|
||||
* @param [in] distance The distance from the center coordinate to the
|
||||
* destination coordinate
|
||||
*
|
||||
* @return offset coordinate
|
||||
*/
|
||||
common::Coordinate GetCoordinate(const common::Coordinate& center,
|
||||
units::angle::degrees<double> angle,
|
||||
units::length::meters<double> distance);
|
||||
|
||||
/**
|
||||
* Get a coordinate from an (i, j) offset.
|
||||
*
|
||||
* @param [in] center The center coordinate from which i and j are offset
|
||||
* @param [in] i The easting offset in meters
|
||||
* @param [in] j The northing offset in meters
|
||||
*
|
||||
*
|
||||
* @return offset coordinate
|
||||
*/
|
||||
common::Coordinate GetCoordinate(const common::Coordinate& center,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue