2

我正在测试一个 JS 库来对一个点数组进行三角测量(它返回一个三角形数组),并且看起来效果很好但是当我添加 MooTools 时(这个库将使用 MooTools 集成到一个更大的项目中,所以我需要它)它停止工作。:(

我的意思是我只需要在标题中添加 MooTools (既不添加 domready 事件),我得到一个错误......

Uncaught TypeError: Object function (){
            return lower;
        } has no method 'InCircumcircle'

我尝试添加 JQuery 而不是 MooTools,它甚至在 domready 块内也能正常工作......所以我不知道 mootools 有什么问题......(也许 MooTools 改变了与这个库不兼容的 JS 对象模型中的某些内容?)

我不知道如何解决它......或者我是菜鸟,这是一个我看不到的小细节...... :)

我在 JSFiddle 中准备了一个小演示,您可以自己查看:http:
//jsfiddle.net/6KcW9/

delauny.js链接在管理资源部分。

按原样运行这个简单的代码,您会看到它向控制台输出了一系列元素...尝试在框架部分添加 MooTools 并再次运行它。
任何帮助/线索/任何将是伟大的赞赏......

4

2 回答 2

1

你看过他们的源代码吗?

http://www.travellermap.com/tmp/delaunay.js

MooTools 是一个原型框架。这意味着,它将方法添加到本机原型,可以迭代。

var i;
for( i in vertices )
{
    // NOTE: This is O(n^2) - can be optimized by sorting vertices
    // along the x-axis and only considering triangles that have 
    // potentially overlapping circumcircles

    var vertex = vertices[i];
    AddVertex( vertex, triangles );
}

像这样的代码,其中顶点是一个数组 - 将完全中断。该for (var in object)构造是一种遍历对象属性的方法。相反,传递的是一个数组(它 - 就像 js 中的几乎任何东西一样 - 是一个对象,但具有类似数组的属性)。

var g_vertices = [];
for( var i = 0; i < 50; i++ ) {
    g_vertices.push( new Vertex( Math.random() * 350 + 25, Math.random() * 250 + 25 ) );
}
// var triangles = Triangulate( g_vertices );
// console.log(triangles);

console.log(g_vertices);

for (var i in g_vertices) {
    console.log(i);
}

当您将 mootools 添加到页面时,结果是:

0, 1, 2 .... 49, $family, $constructor, each, clone, clean, invoke ... etc.

基本上,您需要修复他们的库。要么使用hasOwnPropertycheck -> if (g_vertices.hasOwnProperty(i)) ...- 要么使用适当的for数组迭代器,while或者甚至使用Array.forEach任何你喜欢的。

找到这样的替代方案:https ://github.com/sokeroner/Delaunay-Triangulation - 这似乎写得更好,更模块化。

于 2012-08-04T10:55:56.720 回答
0

因为您将所有东西都添加到全局命名空间中,所以您可能会遇到麻烦。

你真的应该将你的代码包装在一个模块中,这样你就不会污染全局命名空间。

于 2012-08-03T19:24:33.863 回答