|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 |
|
Member
Iscritto dal: Jun 2013
Messaggi: 133
|
Complimenti! Io ancora non ho risolto, ma secondo me hai centrato il problema!
|
|
|
|
|
|
#22 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
- stampato il vettore passato e scoperto che, sebbene i dati sono corretti, nashorn mantiene il tipo di array java (la signature e' Java); - creato un nuovo array copiando i dati in un array javascript. Sicuramente c'e' un modo migliore per fare questa cosa; comunque funziona. Se vuoi provare, basta modificare la funzione hull in javascript cosi', e dovrebbe funzionare tutto (dico dovrebbe perche' non ho piu' verificato l'output, ma non ci sono piu' errori/eccezioni): Codice:
function hull(jpointset, concavity, format) {
var lower, upper, convex,
innerPoints,
maxSearchBBoxSize,
maxEdgeLen = concavity || 20;
if (jpointset.length < 4) {
return jpointset;
}
print('Stampo il jpointset');
for (var i = 0; i < jpointset.length; i++)
{
print(i + ") - [" + jpointset[i][0] + ", " + jpointset[i][1] + ")");
}
print('jpointset stampato');
print('creo un array javascript. In questo modo l'array contiene gli stessi valori ma il tipo e' quello corretto');
var pointset = new Array();
for (var i = 0; i < jpointset.length; i++)
{
pointset[i] = jpointset[i];
}
pointset = _sortByX(_formatToXy(pointset, format));
upper = _upperTangent(pointset);
lower = _lowerTangent(pointset);
convex = lower.concat(upper);
convex.push(pointset[0]);
maxSearchBBoxSize = Math.max(pointset[pointset.length - 1][0], _getMaxY(convex)) * MAX_SEARCH_BBOX_SIZE_PERCENT;
innerPoints = pointset.filter(function(pt) {
return convex.indexOf(pt) < 0;
});
return _xyToFormat(_concave(convex, Math.pow(maxEdgeLen, 2), maxSearchBBoxSize, grid(innerPoints)), format);
}
MODIFICA - ero curioso ed ho controllato i valori di uscita e sono tutti corretti (vale a dire che ottengo gli stessi valori che si ottengono dall'html). Ricorda pero' una cosa: gli array di javascript sono corrispondenti alle HashMap di java, non ai vettori. L'indice del vettore e' la chiave dell'hash map. Cmq i valori sono tutti li (esattamente quelli che hai scritto) e sono facili da usare. Fammi sapere se ti servono piu' dettagli
__________________
In God we trust; all others bring data Ultima modifica di sottovento : 02-11-2015 alle 07:28. |
|
|
|
|
|
|
#23 |
|
Member
Iscritto dal: Jun 2013
Messaggi: 133
|
Ottimo!!! Potrai anche non crederci, ma a me va in eccezione...
Mi devi postare il codice, sicuramente sbaglio qualcosa!!! Per codice intendo tutta la classe perché aggiunte o sostituzioni blocchi, mi condanni!!! Grazie! |
|
|
|
|
|
#24 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Ok, ti metto un po' di cose qui.
Per la cronaca: mi sono aiutato con le varie print() e con il debugger di Netbeans. Per farlo ho dovuto creare un progetto netbeans e fare qualche leggera modifica. Se non riesci a far andare il codice che posto qui, contattami in privato e ti mando una mail con tutto questo e' CHull.java: Codice:
package com.sottovento;
import java.io.FileNotFoundException;
import java.io.FileReader;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class CHull
{
static double[][] inputPoints =
{
{0.441, 0.229},
{0.436, 0.237},
{0.386, 0.308},
{0.389, 0.273},
{0.389, 0.269},
{0.386, 0.264},
{0.386, 0.252},
{0.386, 0.251},
{0.386, 0.249},
{0.383, 0.244},
{0.377, 0.239},
{0.377, 0.207},
{0.377, 0.204},
{0.368, 0.199},
{0.278, 0.168},
{0.26, 0.154},
{0.258, 0.153},
{0.258, 0.144},
{0.257, 0.128},
{0.231, 0.119},
{0.229, 0.111},
{0.226, 0.105},
{0.215, 0.1},
{0.122, 0.088},
{0.114, 0.087},
{0.102, 0.075},
{0.102, 0.067},
{0.093, 0.049},
{0.003, 0.02},
{0.01, 0.01},
{0.064, -0.026},
{0.146, 0},
{0.213, 0.005},
{0.228, 0.001},
{0.268, 0.081},
{0.28, 0.093},
{0.345, 0.163},
{0.373, 0.16},
{0.377, 0.159},
{0.378, 0.159},
{0.38, 0.159},
{0.381, 0.159},
{0.383, 0.159},
{0.422, 0.199},
{0.441, 0.229}
};
static String[][] mat2X ={{"0.064", "0.056", "0.043", "0.052", "0.063", "0.096", "0.101", "0.096", "0.09", "0.09", "0.093" },
{"0.01", "0.008", "0.003", "0.005", "0.025", "0.051", "0.055", "0.057", "0.063", "0.068", "0.064" }};
public static String toJavascriptArray(String[][] arr)
{
StringBuilder sb = new StringBuilder();
sb.append("[");
for(int i=0; i<arr[0].length; i++)
{
sb.append("[").append(arr[0][i]).append(",");
sb.append(arr[1][i]).append("]");
if(!(i==arr[0].length-1))
sb.append(",");
}
sb.append("]");
return sb.toString();
}
public static void main(String[] args) throws Exception
{
System.out.println("array "+toJavascriptArray(mat2X));
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
try
{
engine.eval(new FileReader("hull.js"));
}
catch (FileNotFoundException | ScriptException e)
{
// Penso di aver capito perche' il caricamento fallisce!! Il browser ha definito degli oggetti che probabilmente nashorn non ha definito!
// Probabilmente il browser ha definito cose come window, document e cosi' via. Hull fa riferimento a questi oggetti, ma siccome nashorn non ne ha
// nemmeno uno, hull fallisce
e.printStackTrace(System.out);
}
Invocable invocable = (Invocable) engine;
// Object result = invocable.invokeFunction("hull", inputPoints, 0.50);
Object result = invocable.invokeFunction("entryPoint", inputPoints, 0.50);
// Object result = invocable.invokeFunction("testMydata");
System.out.println(result);
System.out.println(result.getClass());
}
}
Codice:
var entryPoint;
function testMydata()
{
print('Call the entry point');
entryPoint([[0.441,0.229], [0.436,0.237], [0.386,0.308], [0.389,0.273], [0.389,0.269], [0.386,0.264], [0.386,0.252], [0.386,0.251], [0.386,0.249], [0.383,0.244], [0.377,0.239], [0.377,0.207], [0.377,0.204], [0.368,0.199], [0.278,0.168], [0.26,0.154], [0.258,0.153], [0.258,0.144], [0.257,0.128], [0.231,0.119], [0.229,0.111], [0.226,0.105], [0.215,0.1], [0.122,0.088], [0.114,0.087], [0.102,0.075], [0.102,0.067], [0.093,0.049], [0.003,0.02], [0.01,0.01], [0.064,-0.026], [0.146,0], [0.213,0.005], [0.228,0.001], [0.268,0.081], [0.28,0.093], [0.345,0.163], [0.373,0.16], [0.377,0.159], [0.378,0.159], [0.38,0.159], [0.381,0.159], [0.383,0.159], [0.422,0.199], [0.441,0.229]], 0.50);
print('Call was successful!');
}
!function(e)
{
if ("object"==typeof exports && "undefined"!=typeof module)
{
console.log('(e) - checkpoint 1');
module.exports=e();
}
else if ("function"==typeof define&&define.amd)
define([],e);
else
{
// var f;
// "undefined"!=typeof window ?
// f=window :
// "undefined"!=typeof global ?
// f=global :
// "undefined"!=typeof self&&(f=self),
// console.log('A questo punto, f=' + f); // This for firefox
// //print('A questo punto, f=' + f); // This for nashorn
// f.hull=e()
entryPoint = e();
}
}
(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
function Grid(points) {
var _cells = [];
points.forEach(function(point) {
var cellXY = this.point2CellXY(point),
x = cellXY[0],
y = cellXY[1];
if (_cells[x] === undefined) {
_cells[x] = [];
}
if (_cells[x][y] === undefined) {
_cells[x][y] = [];
}
_cells[x][y].push(point);
}, this);
this.cellPoints = function(x, y) { // (Number, Number) -> Array
return (_cells[x] !== undefined && _cells[x][y] !== undefined) ? _cells[x][y] : [];
};
this.removePoint = function(point) { // (Array) -> Array
var cellXY = this.point2CellXY(point),
cell = _cells[cellXY[0]][cellXY[1]],
pointIdxInCell;
for (var i = 0; i < cell.length; i++) {
if (cell[i][0] === point[0] && cell[i][1] === point[1]) {
pointIdxInCell = i;
break;
}
}
cell.splice(pointIdxInCell, 1);
return cell;
};
}
Grid.prototype = {
point2CellXY: function(point) { // (Array) -> Array
var x = parseInt(point[0] / Grid.CELL_SIZE),
y = parseInt(point[1] / Grid.CELL_SIZE);
return [x, y];
},
rangePoints: function(bbox) { // (Array) -> Array
var tlCellXY = this.point2CellXY([bbox[0], bbox[1]]),
brCellXY = this.point2CellXY([bbox[2], bbox[3]]),
points = [];
for (var x = tlCellXY[0]; x <= brCellXY[0]; x++) {
for (var y = tlCellXY[1]; y <= brCellXY[1]; y++) {
points = points.concat(this.cellPoints(x, y));
}
}
return points;
},
addBorder2Bbox: function(bbox, border) { // (Array, Number) -> Array
return [
bbox[0] - (border * Grid.CELL_SIZE),
bbox[1] - (border * Grid.CELL_SIZE),
bbox[2] + (border * Grid.CELL_SIZE),
bbox[3] + (border * Grid.CELL_SIZE)
];
}
};
function grid(points) {
return new Grid(points);
}
Grid.CELL_SIZE = 10;
module.exports = grid;
},{}],2:[function(require,module,exports){
/*
(c) 2014, Andrey Geonya
Hull.js, a JavaScript library for concave hull generation by set of points.
https://github.com/AndreyGeonya/hull
*/
'use strict';
var intersect = require('./intersect.js');
var grid = require('./grid.js');
function _formatToXy(pointset, format) {
if (format === undefined) {
return pointset;
}
return pointset.map(function(pt) {
/*jslint evil: true */
var _getXY = new Function('pt', 'return [pt' + format[0] + ',' + 'pt' + format[1] + '];');
return _getXY(pt);
});
}
function _xyToFormat(pointset, format) {
if (format === undefined) {
return pointset;
}
return pointset.map(function(pt) {
/*jslint evil: true */
var _getObj = new Function('pt', 'var o = {}; o' + format[0] + '= pt[0]; o' + format[1] + '= pt[1]; return o;');
return _getObj(pt);
});
}
function _sortByX(pointset) {
return pointset.sort(function(a, b) {
if (a[0] == b[0]) {
return a[1] - b[1];
} else {
return a[0] - b[0];
}
});
}
function _getMaxY(pointset) {
var maxY = -Infinity;
for (var i = pointset.length - 1; i >= 0; i--) {
if (pointset[i][1] > maxY) {
maxY = pointset[i][1];
}
}
return maxY;
}
function _upperTangent(pointset) {
var lower = [];
for (var l = 0; l < pointset.length; l++) {
while (lower.length >= 2 && (_cross(lower[lower.length - 2], lower[lower.length - 1], pointset[l]) <= 0)) {
lower.pop();
}
lower.push(pointset[l]);
}
lower.pop();
return lower;
}
function _lowerTangent(pointset) {
var reversed = pointset.reverse(),
upper = [];
for (var u = 0; u < reversed.length; u++) {
while (upper.length >= 2 && (_cross(upper[upper.length - 2], upper[upper.length - 1], reversed[u]) <= 0)) {
upper.pop();
}
upper.push(reversed[u]);
}
upper.pop();
return upper;
}
function _cross(o, a, b) {
return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);
}
function _sqLength(a, b) {
return Math.pow(b[0] - a[0], 2) + Math.pow(b[1] - a[1], 2);
}
function _cos(o, a, b) {
var aShifted = [a[0] - o[0], a[1] - o[1]],
bShifted = [b[0] - o[0], b[1] - o[1]],
sqALen = _sqLength(o, a),
sqBLen = _sqLength(o, b),
dot = aShifted[0] * bShifted[0] + aShifted[1] * bShifted[1];
return dot / Math.sqrt(sqALen * sqBLen);
}
function _intersect(segment, pointset) {
for (var i = 0; i < pointset.length - 1; i++) {
var seg = [pointset[i], pointset[i + 1]];
if (segment[0][0] === seg[0][0] && segment[0][1] === seg[0][1] ||
segment[0][0] === seg[1][0] && segment[0][1] === seg[1][1]) {
continue;
}
if (intersect(segment, seg)) {
return true;
}
}
return false;
}
function _bBoxAround(edge, boxSize) {
var minX, maxX, minY, maxY;
if (edge[0][0] < edge[1][0]) {
minX = edge[0][0] - boxSize;
maxX = edge[1][0] + boxSize;
} else {
minX = edge[1][0] - boxSize;
maxX = edge[0][0] + boxSize;
}
if (edge[0][1] < edge[1][1]) {
minY = edge[0][1] - boxSize;
maxY = edge[1][1] + boxSize;
} else {
minY = edge[1][1] - boxSize;
maxY = edge[0][1] + boxSize;
}
return [
minX, minY, // tl
maxX, maxY // br
];
}
function _midPoint(edge, innerPoints, convex) {
var point = null,
angle1Cos = MAX_CONCAVE_ANGLE_COS,
angle2Cos = MAX_CONCAVE_ANGLE_COS,
a1Cos, a2Cos;
for (var i = 0; i < innerPoints.length; i++) {
a1Cos = _cos(edge[0], edge[1], innerPoints[i]);
a2Cos = _cos(edge[1], edge[0], innerPoints[i]);
if (a1Cos > angle1Cos && a2Cos > angle2Cos &&
!_intersect([edge[0], innerPoints[i]], convex) &&
!_intersect([edge[1], innerPoints[i]], convex)) {
angle1Cos = a1Cos;
angle2Cos = a2Cos;
point = innerPoints[i];
}
}
return point;
}
function _concave(convex, maxSqEdgeLen, maxSearchBBoxSize, grid) {
var edge,
border,
bBoxSize,
midPoint,
bBoxAround,
midPointInserted = false;
for (var i = 0; i < convex.length - 1; i++) {
edge = [convex[i], convex[i + 1]];
if (_sqLength(edge[0], edge[1]) < maxSqEdgeLen) { continue; }
border = 0;
bBoxSize = MIN_SEARCH_BBOX_SIZE;
bBoxAround = _bBoxAround(edge, bBoxSize);
do {
bBoxAround = grid.addBorder2Bbox(bBoxAround, border);
bBoxSize = bBoxAround[2] - bBoxAround[0];
midPoint = _midPoint(edge, grid.rangePoints(bBoxAround), convex);
border++;
} while (midPoint === null && maxSearchBBoxSize > bBoxSize);
if (midPoint !== null) {
convex.splice(i + 1, 0, midPoint);
grid.removePoint(midPoint);
midPointInserted = true;
}
}
if (midPointInserted) {
return _concave(convex, maxSqEdgeLen, maxSearchBBoxSize, grid);
}
return convex;
}
function hull(jpointset, concavity, format) {
var lower, upper, convex,
innerPoints,
maxSearchBBoxSize,
maxEdgeLen = concavity || 20;
if (jpointset.length < 4) {
return jpointset;
}
print('Stampo il jpointset');
for (var i = 0; i < jpointset.length; i++)
{
print(i + ") - [" + jpointset[i][0] + ", " + jpointset[i][1] + ")");
}
print('jpointset stampato');
print('creo un array javascript');
var pointset = new Array();
for (var i = 0; i < jpointset.length; i++)
{
pointset[i] = jpointset[i];
}
pointset = _sortByX(_formatToXy(pointset, format));
upper = _upperTangent(pointset);
lower = _lowerTangent(pointset);
convex = lower.concat(upper);
convex.push(pointset[0]);
maxSearchBBoxSize = Math.max(pointset[pointset.length - 1][0], _getMaxY(convex)) * MAX_SEARCH_BBOX_SIZE_PERCENT;
innerPoints = pointset.filter(function(pt) {
return convex.indexOf(pt) < 0;
});
return _xyToFormat(_concave(convex, Math.pow(maxEdgeLen, 2), maxSearchBBoxSize, grid(innerPoints)), format);
}
var MAX_CONCAVE_ANGLE_COS = Math.cos(90 / (180 / Math.PI)); // angle = 90 deg
var MIN_SEARCH_BBOX_SIZE = 5;
var MAX_SEARCH_BBOX_SIZE_PERCENT = 0.8;
module.exports = hull;
},{"./grid.js":1,"./intersect.js":3}],3:[function(require,module,exports){
function ccw(x1, y1, x2, y2, x3, y3) {
var cw = ((y3 - y1) * (x2 - x1)) - ((y2 - y1) * (x3 - x1));
return cw > 0 ? true : cw < 0 ? false : true; // colinear
}
function intersect(seg1, seg2) {
var x1 = seg1[0][0], y1 = seg1[0][1],
x2 = seg1[1][0], y2 = seg1[1][1],
x3 = seg2[0][0], y3 = seg2[0][1],
x4 = seg2[1][0], y4 = seg2[1][1];
return ccw(x1, y1, x3, y3, x4, y4) !== ccw(x2, y2, x3, y3, x4, y4) && ccw(x1, y1, x2, y2, x3, y3) !== ccw(x1, y1, x2, y2, x4, y4);
}
module.exports = intersect;
},{}]},{},[2])(2)
});
__________________
In God we trust; all others bring data |
|
|
|
|
|
#25 |
|
Member
Iscritto dal: Jun 2013
Messaggi: 133
|
Non c è verso di farlo andare... Va in eccezione...
Ti contatto in MP. |
|
|
|
|
|
#26 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Strano. Ho fatto altre prove ma continua ad andare.
Fai una prova tu: ho compilato il codice e creato un .jar. Lo trovi in allegato Crea una nuova directory, scomprimi il contenuto (contiene solo il .jar ed il .js) e scrivi java -jar TestNashorn.jar vedrai un po' di scritte (i dati che vorresti stampare non vengono stampati perche' non si deve fare cosi', ma e' un dettaglio). Ok
__________________
In God we trust; all others bring data |
|
|
|
|
|
#27 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Dimenticavo: puoi specificare
- tipo di eccezione ed eventuale stack trace; - versione di java in uso (deve essere almeno 8)
__________________
In God we trust; all others bring data |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:14.




















