(cd)
| 186 | } |
| 187 | |
| 188 | function setCoords(cd) { |
| 189 | if(!cd.length) return; |
| 190 | |
| 191 | var cd0 = cd[0]; |
| 192 | var trace = cd0.trace; |
| 193 | |
| 194 | var aspectratio = trace.aspectratio; |
| 195 | |
| 196 | var h = trace.baseratio; |
| 197 | if(h > 0.999) h = 0.999; // TODO: may handle this case separately |
| 198 | var h2 = Math.pow(h, 2); |
| 199 | |
| 200 | var v1 = cd0.vTotal; |
| 201 | var v0 = v1 * h2 / (1 - h2); |
| 202 | |
| 203 | var totalValues = v1; |
| 204 | var sumSteps = v0 / v1; |
| 205 | |
| 206 | function calcPos() { |
| 207 | var q = Math.sqrt(sumSteps); |
| 208 | return { |
| 209 | x: q, |
| 210 | y: -q |
| 211 | }; |
| 212 | } |
| 213 | |
| 214 | function getPoint() { |
| 215 | var pos = calcPos(); |
| 216 | return [pos.x, pos.y]; |
| 217 | } |
| 218 | |
| 219 | var p; |
| 220 | var allPoints = []; |
| 221 | allPoints.push(getPoint()); |
| 222 | |
| 223 | var i, cdi; |
| 224 | for(i = cd.length - 1; i > -1; i--) { |
| 225 | cdi = cd[i]; |
| 226 | if(cdi.hidden) continue; |
| 227 | |
| 228 | var step = cdi.v / totalValues; |
| 229 | sumSteps += step; |
| 230 | |
| 231 | allPoints.push(getPoint()); |
| 232 | } |
| 233 | |
| 234 | var minY = Infinity; |
| 235 | var maxY = -Infinity; |
| 236 | for(i = 0; i < allPoints.length; i++) { |
| 237 | p = allPoints[i]; |
| 238 | minY = Math.min(minY, p[1]); |
| 239 | maxY = Math.max(maxY, p[1]); |
| 240 | } |
| 241 | |
| 242 | // center the shape |
| 243 | for(i = 0; i < allPoints.length; i++) { |
| 244 | allPoints[i][1] -= (maxY + minY) / 2; |
| 245 | } |
no test coverage detected
searching dependent graphs…