Newer
Older
Copyright 2016,2017 Bill Binder <dxtwjb@gmail.com>
Copyright (C) 2011, 2012, 2013 Glad Deschrijver <glad.deschrijver@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.1
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.plasmoid 2.0
import "../code/shadowcalcs.js" as ShadowCalcs
Item {
id: lunaIcon
property int phaseNumber: 0
property int hemisphere: 0
property bool showShadow: true
property string lunarImage: ''
property int lunarImageTweak: 0
// Degrees. 0= new moon, 90= first quarter, 180= full moon, 270= third quarter
property int theta: 45
imagePath: plasmoid.file("data", lunarImage);
anchors.centerIn: parent
width: Math.min(parent.width,parent.height)
height: Math.min(parent.width,parent.height)
svg: lunaSvg
// deal with northern <-> southern hemisphere
transformOrigin: Item.Center
rotation: (hemisphere == 0 ? 0 : 180) - lunarImageTweak
Canvas {
id: shadow
width: lunaSvgItem.width
height: lunaSvgItem.height
property int hemisphere: lunaIcon.hemisphere
property int theta: lunaIcon.theta
property bool showShadow: lunaIcon.showShadow
anchors.centerIn: parent
contextType: "2d"
onHemisphereChanged: requestPaint()
onThetaChanged: requestPaint()
onPaint:
{
context.reset()
context.globalAlpha = 0.9
context.fillStyle = '#000000'
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
function radians(deg) {
return deg / 180.0 * Math.PI;
}
function marker(latitude,longitude) {
var dy = radius * Math.sin(radians(latitude))
var dx = radius * Math.cos(radians(latitude)) * Math.sin(radians(longitude))
//console.log("dx: " + dx.toString())
//console.log("dy: " + dy.toString())
context.beginPath()
context.strokeStyle = "#FF0000"
context.arc(dx,-dy,5,0,2*Math.PI)
context.moveTo(dx-5, -dy-5)
context.lineTo(dx+5, -dy+5)
context.moveTo(dx-5, -dy+5)
context.lineTo(dx+5, -dy-5)
context.stroke()
}
function grid() {
context.beginPath()
context.strokeStyle = "#FF4040"
context.moveTo(0,-radius)
context.lineTo(0,radius)
context.moveTo(-radius,0)
context.lineTo(radius,0)
context.stroke()
context.beginPath()
context.strokeStyle = "#40FF40"
for (var ll=10;ll<65;ll+=10) {
var dy = radius * Math.sin(radians(ll))
context.moveTo(-radius,dy)
context.lineTo(radius,dy)
context.moveTo(-radius,-dy)
context.lineTo(radius,-dy)
}
context.stroke()
}
console.log("Angle: " + theta.toString())
var ct = Math.cos(theta/180*Math.PI)
var radius = ShadowCalcs.setup(Math.floor(shadow.height/2))
//console.log("radius: " + radius.toString())
context.translate(radius,radius)
if (hemisphere>0)
context.rotate(Math.PI)
// These two determine which side of the centre meridan to draw
// the two arcs enclosing the shadow area.
var terminator = (theta <= 180) ? 1 : -1
var edge = (theta <= 180) ? -1 : 1
if (showShadow) {
context.beginPath()
context.moveTo(ShadowCalcs.get(-radius), -radius)
for (var z = -radius+1; z <= radius; z++ ) {
context.lineTo(terminator*ShadowCalcs.get(z)*ct, z)
}
for (z = radius-1; z >= -radius+1; --z) {
context.lineTo(edge*ShadowCalcs.get(z), z)
}
context.closePath()
context.fill()
else {
// Callibration markers
grid()
marker(-43,-11.5) // Tycho
marker(9.6,-20) // Copernicus