Kontrast
Demos
Download
Contact
[deutsch]
Polygon cursor
function pointInsidePolygon( horizontalCoordinate, verticalCoordinate, h, v ) { let insideCount = 0 let outsideCount = 0 let vertexCount = horizontalCoordinate.length let J = vertexCount - 1 let even = false for (let I = 0; I < vertexCount; I++) { let polyI0 = horizontalCoordinate[I] let polyI1 = verticalCoordinate[I] let polyJ0 = horizontalCoordinate[J] let polyJ1 = verticalCoordinate[J] if ( polyI1 > v !== polyJ1 > v && h < polyI0 + ((polyJ0 - polyI0) * (v - polyI1)) / (polyJ1 - polyI1) ) { even = !even } J = I } return even // even means: the point (h, v) is inside } kontrast.addEventListener('load', function() { let figure = kontrast.createFigure({ element: 'figure0' }) let count = 100 let xPointList = new Float64Array(count) let yPointList = new Float64Array(count) let cPointList = new Float64Array(count) for (let i = 0; i < count; i++) { xPointList[i] = Math.random() yPointList[i] = Math.random() } let graph = figure.createGraph({ abscissae: { x: { yOrigin: -1 } }, ordinates: { y: { xOrigin: -1 } }, colorAxes: { c: { hidden: true, excludeFromLayout: true, colorBelow: 'red', color0: 'red', color1: 'blue', colorAbove: 'blue', min: 0, max: 1 } } }) let pointPlot = graph.createPoints({ color: 'blue', thickness: 9, opacity: 0.8, data: { x: xPointList, y: yPointList, c: cPointList } }) let cursor0 = graph.createCursor({ color: 'blue', thickness: 9, opacity: 0.8, data: { x: [0.1, 0.2, 0.7, 0.6], y: [0.5, 0.1, 0.2, 0.6] } }) let xAverageElement = document.getElementById('x-average') let yAverageElement = document.getElementById('y-average') let xAverage let yAverage let averageCount update() cursor0.data.addEventListener('change', update) function update() { xAverage = 0 yAverage = 0 averageCount = 0 for (let i = 0; i < count; i++) { if ( pointInsidePolygon( cursor0.data.value.x, cursor0.data.value.y, xPointList[i], yPointList[i] ) ) { cPointList[i] = 1 xAverage += xPointList[i] yAverage += yPointList[i] averageCount++ } else { cPointList[i] = -1 } } xAverage /= averageCount yAverage /= averageCount xAverageElement.innerHTML = 'x average: ' + xAverage yAverageElement.innerHTML = 'y average:' + yAverage pointPlot.data.update() } })