2

問題:pointsポリゴンのを変更すると、別のポリゴンのpoly2も変更されます!!pointspoly

一方を変更すると他方も変更されるのはなぜですか

console.log(poly.getPoints()[1].x);  // 100

// Make a change to `poly2`
poly2.setPoints(poly.getPoints());
poly2.getPoints()[1].x=200

console.log(poly.getPoints()[1].x);  // 200 (both poly and poly2 are affected!)

jsfiddle: http://jsfiddle.net/8hFyv/

4

5 に答える 5

2
poly2.setPoints(poly.getPoints());

これはあなたの問題です。ポイント配列はまったく同じオブジェクトです。

配列に配列があるため、このslice(0)トリックは機能しません。ディープ コピーが必要です。

幸いなことに、jQuery を使用しています。jQuery にはそれを行うメソッドがあります。

上記の行を次のように置き換えます。

poly2.setPoints($.extend(true, [], poly.getPoints()));
于 2012-12-28T01:25:24.417 に答える
1

これを行うと、poly と poly2 オブジェクトは同じ点の配列を参照しています。

poly2.setPoints(poly.getPoints());

これを次のように変更します。

poly2.setPoints([0, 0, 100, 0, 100, 100, 0, 100]);
于 2012-12-28T01:25:20.227 に答える
1

ポイントを複製するには、ポリゴン間でポイントを共有するのではなく、それぞれに新しいオブジェクトを作成する必要があります。

あなたはこれを行うことができますmap

poly2.setPoints(poly.getPoints().map(function (p) {
    return { x: p.x, y: p.y };
}));

または、次の場合jQuery.map:

poly2.setPoints($.map(poly.getPoints(), function (p) {
    return { x: p.x, y: p.y };
}));
于 2012-12-28T01:34:40.857 に答える
1

問題を評価する上で他の答えは正しいですが、それを解決する別の方法があります。設定時にポイント配列を「複製」します。言い換えると:

poly2.setPoints(poly.getPoints().slice());

何らかの理由getPoints()で配列以外のものを返す場合は、別のクローン作成アプローチが必要になります (たとえば、 axel.michel が提案したもの)。

于 2012-12-28T01:34:44.340 に答える
1

問題は、poly.getPoints がキネティック ポインター オブジェクトのセットであることです。これを取り除くには、次のことを試してください。

poly2.setPoints(JSON.parse(JSON.stringify(poly.getPoints())));
于 2012-12-28T01:34:50.720 に答える