Di chuyển tàu giữa hai hành tinh dọc theo một máy bay, thiếu một số phương trình để tăng tốc


48

OK, tôi đã đăng bài này tại math.stackechange.com nhưng không nhận được câu trả lời nào :(

Trước tiên, đây là hình ảnh về vấn đề của tôi, mô tả sau đây:

văn bản thay thế

Vì vậy, tôi đã nhận được tất cả các điểm và giá trị được thiết lập.

Con tàu bắt đầu di chuyển xung quanh hành tinh bên trái P1với S=0.27 Degreesmỗi giao tử, khi nó chạm tới Point Anó bắt đầu theo đường cong bezier cho đến khi nó chạm tới Point D, sau đó nó di chuyển quanh hành tinh phải P2với S=0.42 Degreesmỗi tích tắc trò chơi. Sự khác biệt Slà để hành trình có cùng tốc độ di chuyển xung quanh các hành tinh.

Cho đến nay rất tốt, tôi đã có được điều đó và chạy, bây giờ vấn đề của tôi.

Khi S P1S P2khác nhau nhiều, con tàu nhảy giữa hai tốc độ khi đến đích, trông khá tệ. Vì vậy, tôi cần phải tăng tốc con tàu giữa Point APoint Dtừ S P1đến S P2.

Thứ tôi thiếu là màu tím, đó là:

  • Một cách để tính toán các con bọ cần thiết để con tàu di chuyển dọc theo bezier xem xét gia tốc.

  • Và một cách để tìm một vị trí trên đường cong bezier dựa trên T, một lần nữa xem xét gia tốc.

ATM tôi tính chiều dài của bezier bằng cách tính khoảng cách giữa Ncác điểm của nó. Vì vậy, những gì tôi nghĩ rằng tôi cần, là một cách để mở rộng quy mô mà Ttôi cần đưa vào tính toán của mình cho phù hợp với gia tốc.


2
Làm việc tốt để tìm ra điều đó. Tôi đề nghị bạn đăng những phát hiện của bạn như một câu trả lời cho câu hỏi của bạn.
bummzack

Câu trả lời:


83

OK, tôi đã làm mọi thứ hoạt động, phải mất mãi mãi, vì vậy tôi sẽ đăng giải pháp chi tiết của mình ở đây.
Lưu ý: Tất cả các mẫu mã đều bằng JavaScript.

Vì vậy, hãy chia nhỏ vấn đề thành các phần cơ bản:

  1. Bạn cần tính toán độ dài, cũng như các điểm giữa 0..1trên đường cong bezier

  2. Bây giờ bạn cần điều chỉnh tỷ lệ của bạn Tđể tăng tốc con tàu từ tốc độ này sang tốc độ khác

Bắt Bezier đúng

Tìm một số mã để vẽ đường cong Bezier rất dễ dàng, có một số cách tiếp cận khác nhau, một trong số đó là Thuật toán DeCasteljau , nhưng bạn cũng có thể chỉ sử dụng phương trình cho các đường cong Bézier:

// Part of a class, a, b, c, d are the four control points of the curve
x: function (t) {
    return ((1 - t) * (1 - t) * (1 - t)) * this.a.x
           + 3 * ((1 - t) * (1 - t)) * t * this.b.x
           + 3 * (1 - t) * (t * t) * this.c.x
           + (t * t * t) * this.d.x;
},

y: function (t) {
    return ((1 - t) * (1 - t) * (1 - t)) * this.a.y
           + 3 * ((1 - t) * (1 - t)) * t * this.b.y
           + 3 * (1 - t) * (t * t) * this.c.y
           + (t * t * t) * this.d.y;
}

Với điều này, giờ đây người ta có thể vẽ một đường cong bezier bằng cách gọi xyvới tphạm vi từ đó 0 to 1, hãy xem:

văn bản thay thế

Uh ... đó không thực sự là một sự phân phối đồng đều của các điểm, phải không?
Do tính chất của đường cong Bézier, các điểm trên 0...1có khác nhau arc lenghts, vì vậy các đoạn gần đầu và cuối, dài hơn các điểm nằm gần giữa đường cong.

Ánh xạ T đồng đều trên tham số hóa chiều dài cung AKA

Vậy lam gi? Vâng trong thuật ngữ đơn giản chúng ta cần một chức năng để lập bản đồ của chúng tôi Tvào tcủa đường cong, do đó chúng tôi T 0.25kết quả trong ttại đó 25%chiều dài của đường cong.

làm sao chúng ta làm việc đó bây giờ? Vâng, chúng tôi Google ... nhưng nó chỉ ra rằng thuật ngữ này là không phải là googleable , và tại một số điểm bạn sẽ nhấn này PDF . Chắc chắn đó là một bài đọc tuyệt vời, nhưng trong trường hợp bạn đã quên tất cả những thứ toán học bạn đã học ở trường (hoặc bạn không thích những biểu tượng toán học đó) thì nó khá vô dụng.

Gì bây giờ? Hãy đi và tìm hiểu thêm về Google (đọc: 6 giờ) và cuối cùng bạn cũng tìm thấy một bài viết tuyệt vời về chủ đề này (bao gồm cả những bức ảnh đẹp! ^ _ ^ "):
Http://www.planetclegg.com/projects/WarpingTextToSplines.html

Làm mã thực tế

Trong trường hợp bạn không thể cưỡng lại việc tải xuống bản PDF đó mặc dù bạn đã mất kiến ​​thức toán học từ rất lâu rồi (và bạn đã bỏ qua liên kết bài viết tuyệt vời ), bây giờ bạn có thể nghĩ: "Chúa ơi, việc này sẽ mất hàng trăm dòng mã và hàng tấn CPU "

Không nó sẽ không như vậy. Bởi vì chúng tôi làm những gì tất cả các lập trình viên làm, khi nói đến công cụ toán học:
Chúng tôi chỉ đơn giản là gian lận.

Tham số chiều dài vòng cung, cách lười biếng

Hãy đối mặt với nó, chúng ta không cần độ chính xác vô tận trong trò chơi của mình, phải không? Vì vậy, trừ khi bạn làm việc tại Nasa và dự định gửi cho mọi người Sao Hỏa, bạn sẽ không cần một 0.000001 pixelgiải pháp hoàn hảo.

Vậy làm thế nào để chúng ta ánh xạ Tlên t? Nó đơn giản và chỉ bao gồm 3 bước:

  1. Tính toán Ncác điểm trên đường cong bằng cách sử dụng tvà lưu trữ arc-length(còn gọi là chiều dài của đường cong) tại vị trí đó thành một mảng

  2. Để ánh xạ Tlên t, đầu tiên nhân Tvới tổng chiều dài của đường cong để có được uvà sau đó tìm kiếm mảng độ dài cho chỉ số của giá trị lớn nhất nhỏ hơnu

  3. Nếu chúng ta có một lần truy cập chính xác, hãy trả về giá trị mảng tại chỉ số đó chia cho N, nếu không nội suy một chút giữa điểm chúng ta tìm thấy và điểm tiếp theo, hãy chia điều đó một lần nữa Nvà trả lại.

Đó là tất cả! Vì vậy, bây giờ hãy xem mã hoàn chỉnh:

function Bezier(a, b, c, d) {
    this.a = a;
    this.b = b;
    this.c = c;
    this.d = d;

    this.len = 100;
    this.arcLengths = new Array(this.len + 1);
    this.arcLengths[0] = 0;

    var ox = this.x(0), oy = this.y(0), clen = 0;
    for(var i = 1; i <= this.len; i += 1) {
        var x = this.x(i * 0.05), y = this.y(i * 0.05);
        var dx = ox - x, dy = oy - y;        
        clen += Math.sqrt(dx * dx + dy * dy);
        this.arcLengths[i] = clen;
        ox = x, oy = y;
    }
    this.length = clen;    
}

Điều này khởi tạo đường cong mới của chúng tôi và tính toán arg-lenghts, nó cũng lưu trữ độ dài cuối cùng là total lengthđường cong, yếu tố chính ở đây this.lenlà của chúng tôi N. Cao hơn, ánh xạ sẽ càng chính xác, đối với một đường cong kích thước trong hình trên 100 pointsdường như là đủ, nếu bạn chỉ cần ước tính độ dài tốt, một cái gì đó giống như 25sẽ thực hiện công việc chỉ với 1 pixel trong chúng tôi ví dụ, nhưng sau đó bạn sẽ có một ánh xạ ít chính xác hơn, điều này sẽ dẫn đến việc phân phối không đồng đều Tkhi được ánh xạ tới t.

Bezier.prototype = {
    map: function(u) {
        var targetLength = u * this.arcLengths[this.len];
        var low = 0, high = this.len, index = 0;
        while (low < high) {
            index = low + (((high - low) / 2) | 0);
            if (this.arcLengths[index] < targetLength) {
                low = index + 1;

            } else {
                high = index;
            }
        }
        if (this.arcLengths[index] > targetLength) {
            index--;
        }

        var lengthBefore = this.arcLengths[index];
        if (lengthBefore === targetLength) {
            return index / this.len;

        } else {
            return (index + (targetLength - lengthBefore) / (this.arcLengths[index + 1] - lengthBefore)) / this.len;
        }
    },

    mx: function (u) {
        return this.x(this.map(u));
    },

    my: function (u) {
        return this.y(this.map(u));
    },

Mã ánh xạ thực tế, đầu tiên chúng ta thực hiện đơn giản binary searchtrên các độ dài được lưu trữ của chúng tôi để tìm độ dài lớn nhất nhỏ hơn sau đó targetLength, sau đó chúng ta chỉ cần trả về hoặc thực hiện phép nội suy và trả về.

    x: function (t) {
        return ((1 - t) * (1 - t) * (1 - t)) * this.a.x
               + 3 * ((1 - t) * (1 - t)) * t * this.b.x
               + 3 * (1 - t) * (t * t) * this.c.x
               + (t * t * t) * this.d.x;
    },

    y: function (t) {
        return ((1 - t) * (1 - t) * (1 - t)) * this.a.y
               + 3 * ((1 - t) * (1 - t)) * t * this.b.y
               + 3 * (1 - t) * (t * t) * this.c.y
               + (t * t * t) * this.d.y;
    }
};

Một lần nữa điều này tính toán ttrên đường cong.

Thời gian cho kết quả

văn bản thay thế

Bây giờ sử dụng mxmybạn nhận được một phân phối đồng đều Ttrên đường cong :)

Không khó lắm phải không? Một lần nữa, hóa ra một giải pháp đơn giản (mặc dù không hoàn hảo) sẽ đủ cho một trò chơi.

Trong trường hợp bạn muốn xem mã hoàn chỉnh, có sẵn Gist:
https://gist.github.com/670236

Cuối cùng, tăng tốc cho tàu

Vì vậy, tất cả những gì còn lại bây giờ là tăng tốc cho các con tàu dọc theo con đường của chúng, bằng cách ánh xạ vị trí Tmà sau đó chúng ta sử dụng để tìm tđường cong của chúng ta.

Đầu tiên chúng ta cần hai trong số các phương trình chuyển động , cụ thể là ut + 1/2at²(v - u) / t

Trong mã thực tế sẽ trông như thế này:

startSpeed = getStartingSpeedInPixels() // Note: pixels
endSpeed = getFinalSpeedInPixels() // Note: pixels
acceleration = (endSpeed - startSpeed) // since we scale to 0...1 we can leave out the division by 1 here
position = 0.5 * acceleration * t * t + startSpeed * t;

Sau đó, chúng tôi giảm quy mô xuống 0...1bằng cách làm:

maxPosition = 0.5 * acceleration + startSpeed;
newT = 1 / maxPosition * position;

Và ở đó bạn đi, những con tàu đang di chuyển trơn tru dọc theo con đường.

Trong trường hợp nó không hoạt động ...

Khi bạn đọc nó, mọi thứ đều hoạt động tốt và bảnh bao, nhưng ban đầu tôi có một số vấn đề với phần tăng tốc, khi giải thích vấn đề cho ai đó trong phòng chat gamedev tôi đã tìm thấy lỗi cuối cùng trong suy nghĩ của mình.

Trong trường hợp bạn chưa quên hình ảnh trong câu hỏi ban đầu, tôi đề cập sở đó, hóa ra đó slà tốc độ tính bằng độ , nhưng các con tàu di chuyển dọc theo con đường tính bằng pixel và tôi đã quên mất thực tế đó. Vì vậy, những gì tôi cần làm trong trường hợp này là chuyển đổi độ dịch chuyển theo độ thành độ dịch chuyển theo pixel, hóa ra điều này khá dễ dàng:

function rotationToMovement(planetSize, rotationSpeed) {
    var r = shipAngle * Math.PI / 180;
    var rr = (shipAngle + rotationSpeed) * Math.PI / 180;
    var orbit = planetSize + shipOrbit;
    var dx = Math.cos(r) * orbit - Math.cos(rr) * orbit;
    var dy = Math.sin(r) * orbit - Math.sin(rr) * orbit;
    return Math.sqrt(dx * dx + dy * dy);
};

Vì vậy, đó là tất cả! Cảm ơn vì đã đọc ;)


7
Điều này sẽ mất một thời gian để tiêu hóa. Nhưng wow, câu trả lời tuyệt vời cho câu hỏi của riêng bạn.
Tấn

7
Tôi đã tạo một tài khoản chỉ để nâng cao câu trả lời này
Không ai vào

Có một số điểm bạn của tôi. Làm việc như người ở. Câu hỏi và trả lời cả Upvote.
Jace

2
'i' được nhân với 0,05, trong khi 'len' được đặt thành 100. điều này sẽ 'được' ánh xạ thành '0-5' thay vì '0-1'.
Hoạt động tà ác

1
@EvilActivity Vâng tôi cũng thấy vậy, chiều dài ban đầu của anh ta phải là 20, sau đó quên thay đổi 0,05 thành 0,01. Vì vậy, tốt hơn là có một 'len' động (thích ứng với độ dài cung thực sự, hoặc thậm chí có thể chính xác bằng nó) và tính toán "bước" bằng 1 / 'len'. Tôi thấy nó thật kỳ lạ, không ai khác đã mang điều này lên trong suốt những năm qua !!!
Bill Kotsias

4

Vấn đề là một con tàu sẽ không đi theo quỹ đạo đó một cách tự nhiên. Vì vậy, ngay cả khi nó hoạt động hoàn hảo, nó vẫn không nhìn đúng.

Nếu bạn muốn mô phỏng quá trình chuyển đổi suôn sẻ giữa các hành tinh, tôi sẽ đề nghị thực sự mô hình hóa nó. Các phương trình rất đơn giản vì bạn chỉ có hai lực đáng kể: trọng lực và lực đẩy.

Bạn chỉ cần đặt các hằng số của mình: Khối lượng của P1, P2, tàu

Với mỗi trò chơi đánh dấu (thời gian: t) bạn đang làm 3 việc

  1. Tính trọng lực của p1 trên tàu và p2 trên tàu, thêm các vectơ tổng hợp vào vectơ lực đẩy.

  2. Tính vận tốc mới của bạn dựa trên gia tốc mới của bạn từ bước 1

  3. Di chuyển tàu theo vận tốc mới của bạn

Có thể có vẻ như rất nhiều công việc nhưng nó có thể được thực hiện trong một tá dòng mã và sẽ trông rất tự nhiên.

Nếu bạn cần giúp đỡ với vật lý cho tôi biết.


Tôi có thể xem xét thử nghiệm rằng nếu bạn có thể cung cấp cách thực hiện việc này trong một chức năng cần có t:)
Ivo Wetzel

-Nhưng trong lập trình trò chơi, bạn không sử dụng t làm biến. Về cơ bản, bạn đã ở trong một tình huống tham số, bởi vì bạn chỉ cần tính toán dx và dy mới cho con tàu. Đây là một ví dụ về việc quay quanh hai hành tinh (trong Flash) aharrisbooks.net/flash/fg2r12/twoPlanets.html - và đây là điều tương tự trong Python: aharrisbooks.net/pythonGame/ch09/twoPlanets.py
Hai

2

Tôi tìm thấy một bài viết tuyệt vời giải thích một giải pháp khả thi cho vấn đề này với một ví dụ mã được viết bằng javascript. Nó hoạt động bằng cách "đẩy giá trị t" vào đúng hướng.

Thay vào đó, chúng ta có thể sử dụng thực tế là chiều dài chân trung bình d_avg cho bất kỳ phân phối điểm nào gần giống với độ dài chân mà các chấm cách đều nhau sẽ tạo ra (độ tương tự này tăng khi n tăng). Nếu chúng ta tính toán chênh lệch d_err giữa chiều dài chân thực tế d và chiều dài chân trung bình d_avg, thì tham số thời gian t tương ứng với mỗi điểm có thể được giảm xuống để giảm chênh lệch này.

Câu hỏi này đã có rất nhiều câu trả lời hay, nhưng tôi thấy giải pháp này đáng để chú ý.


1

Cảm ơn cho trang tuyệt vời của bạn mô tả cách bạn giải quyết vấn đề này. Tôi đã làm một cái gì đó hơi khác so với bạn ở một chi tiết, vì tôi bị hạn chế sâu về trí nhớ: Tôi không xây dựng một mảng hoặc phải tìm kiếm "phân khúc" bên phải bằng tìm kiếm nhị phân. Điều này là do tôi luôn biết rằng tôi đang di chuyển từ một đầu của đường cong Bezier của mình sang một đường khác: Do đó, tôi chỉ cần nhớ phân đoạn 'hiện tại' và nếu tôi thấy rằng tôi sẽ đi ra khỏi giới hạn của phân khúc đó để tính toán tiếp theo của tôi vị trí, tôi tính toán phân đoạn tiếp theo (hoặc trước đó) (dựa trên hướng di chuyển.) Điều này hoạt động khá tốt cho ứng dụng của tôi. Một trục trặc duy nhất tôi phải giải quyết là, ở một số đường cong, kích thước của các phân đoạn quá nhỏ đến mức âm mưu tiếp theo của tôi là - vào những thời điểm hiếm hoi - nhiều hơn một phân đoạn trước hiện tại, vì vậy thay vì chỉ đi đến '

Không biết điều này có hợp lý không, nhưng điều này chắc chắn đã giúp tôi.


0

Loại mô hình đó là lạ, và có thể tạo ra kết quả phi logic kỳ lạ. Đặc biệt là nếu tốc độ hành tinh bắt đầu thực sự chậm.

Mô hình các tàu với một lực đẩy.

Khi các con tàu đang ở trên quỹ đạo cuối cùng của chúng trên hành tinh bắt đầu, hãy tăng tốc với lực đẩy hoàn toàn.

Khi con tàu đi trong một khoảng cách nhất định, sử dụng lực đẩy ngược lại để làm chậm con tàu xuống tốc độ quỹ đạo của hành tinh mục tiêu.

Chỉnh sửa: Thực hiện toàn bộ mô phỏng cùng một lúc khi một nút sắp rời khỏi quỹ đạo. hoặc gửi tất cả dữ liệu hoặc chỉ gửi một vài vectơ chuyển động trong khoảng thời gian và nội suy giữa chúng.


Vấn đề là, đây là tất cả dựa trên đánh dấu, không có vị trí trung gian. Đây là một trò chơi nhiều người chơi trên mạng và gửi tất cả các vị trí của hơn 600 tàu trong một trò chơi đầy đủ sẽ giết chết tất cả các mạng. Chỉ có các sự kiện truyền tick tickset, phần còn lại được tính dựa trên tick thế giới hiện tại và offset.
Ivo Wetzel

Tôi chỉnh sửa phản ứng của tôi.
Tấn

0

Nếu tôi hiểu chính xác, vấn đề của bạn bị hạn chế quá mức.

Tôi tin rằng bạn muốn tàu vũ trụ di chuyển dọc theo một đường dẫn cụ thể giữa các quỹ đạo trong một thời gian t và bạn cũng muốn nó tăng tốc từ tốc độ s1 đến tốc độ s2 trong cùng thời gian t . Thật không may, bạn không thể (nói chung) tìm thấy một gia tốc thỏa mãn cả hai ràng buộc này cùng một lúc.

Bạn sẽ phải thư giãn vấn đề của mình một chút để giải quyết vấn đề.


2
Vậy thì làm sao để thư giãn? Những gì tôi có thể tưởng tượng là sửa đổi T mà tôi cắm vào công cụ đường dẫn bezier. Tôi sẽ cần phải tăng tỷ lệ bằng cách nào đó để đầu tiên tăng chậm lên 0,5 và sau đó nhanh hơn đến 1. Vì vậy, con tàu giảm tốc từ tốc độ ban đầu xuống một tốc độ cố định ở giữa đường cong và sau đó tăng tốc trở lại từ tốc độ này đến tốc độ ở cuối của đường cong?
Ivo Wetzel

1
Tôi nghĩ rằng nó sẽ trông thực tế hơn nếu tàu vũ trụ tăng tốc từ tốc độ ban đầu của nó đến một nơi nào đó xung quanh điểm giữa của quá trình chuyển và sau đó giảm tốc về quỹ đạo mới.
Gareth Rees

Tôi vẫn bế tắc về cách cắm tăng tốc vào toàn bộ, tôi cần sửa đổi T bằng cách nào đó: /
Ivo Wetzel

0

Tôi đã bắt gặp câu trả lời này bởi vì tôi đang tìm cách phân phối các điểm đồng đều dọc theo một đường dẫn Svg sử dụng đường cong bezier.

Mặc dù MDN nói rằng nó không được chấp nhận, bạn có thể sử dụng path.getPointAtLengthđể có kết quả chính xác. https://developer.mozilla.org/en-US/docs/Web/API/SVGPathEuity/getPointAtLpm

Nó hiện đang hoạt động trong Chrome / Safari / Firefox và cũng hoạt động trong IE / Edge nhưng tôi đã không xác minh 2 cái đó.


-1

Vấn đề với giải pháp được chấp nhận

Là Bezier một hàm số mũ , chúng tôi mong đợi các tỷ lệ tạm ứng khác nhau trong các khu vực khác nhau của đường cong.

Do giải pháp của Ivo nội suy tuyến tính giữa các mẫu hàm mũ ban đầu này , nên độ không chính xác sẽ bị sai lệch nhiều về phía cuối / giữa của đường cong (thường là khối) trong đó các vùng đồng bằng là lớn nhất; do đó, trừ khi tốc độ mẫu Nđược tăng lên rất nhiều như ông gợi ý, các lỗi là rõ ràng và ở một mức độ phóng to nào đó, sẽ luôn rõ ràng đối với một mức nhất định N, tức là sai lệch là nội tại đối với thuật toán đó. Không tốt cho ví dụ đồ họa dựa trên vector trong đó thu phóng có thể không giới hạn.

Chống lại sự thiên vị thông qua lấy mẫu được hướng dẫn

Một giải pháp khác là remap tuyến tính distanceđể tsau khi để đối trọng với xu hướng tự nhiên là hàm Bezier sản xuất.

Giả sử đây là những gì chúng tôi lý tưởng muốn:

curve length = 10

t      distance
0.2    2
0.4    4
0.6    6
0.8    8
1.0    10

nhưng đây là những gì chúng ta nhận được từ chức năng vị trí Bezier:

t      distance
0.2    0.12
0.4    1.22
0.6    2.45
0.8    5.81
1.0    10.00

Bằng cách xem xét Ncác mẫu được lấy, chúng ta có thể thấy nơi deltas khoảng cách là lớn nhất và lấy mẫu lại ("tách") ở giữa hai khoảng cách liền kề, tăng Nthêm 1. Ví dụ: tách ở t=0.9(nằm giữa đồng bằng lớn nhất), chúng ta có thể được:

0.8    5.81
0.9    7.39
1.0    10.00

Chúng tôi lặp lại quy trình này cho khoảng cách khoảng cách lớn nhất tiếp theo cho đến khi đồng bằng tối đa giữa hai khoảng cách bất kỳ trong toàn bộ nằm dưới một số minDistanceDelta, và cụ thể hơn, epsiloncách xa khoảng cách cụ thể mà chúng tôi muốn ánh xạ tới các bước t; sau đó chúng ta có thể ánh xạ tuyến tính các tbước mong muốn của mình đến distances tương ứng . Điều này tạo ra một hashtable / map mà bạn có thể truy cập với giá rẻ và những giá trị mà bạn có thể nằm giữa, trong thời gian chạy, không có sai lệch.

Khi tập hợp phát triển N, chi phí để lặp lại điều này tăng lên, vì vậy lý tưởng nhất là thực hiện điều này như một quá trình trước. Mỗi lần Ntăng, thêm hai khoảng kết quả mới vào một intervalsbộ sưu tập trong khi loại bỏ khoảng thời gian cũ, đơn lẻ mà chúng đã thay thế. Đây là cấu trúc mà bạn làm việc để tìm khoảng thời gian lớn nhất tiếp theo để chia thành hai. Giữ intervalssắp xếp theo khoảng cách giúp mọi thứ dễ dàng, vì bạn chỉ có thể bật mục công việc tiếp theo ra khỏi cuối, và phân chia, v.v.

Chúng tôi kết thúc với một cái gì đó giống như những gì chúng tôi lý tưởng muốn:

epsilon: 0.01

t            distance
0.200417     2.00417
0.3998132    3.9998132
0.600703     6.00703
0.800001     8.00001
0.9995309    9.995309

Vì chúng tôi đang đoán ở mọi bước, chúng tôi sẽ không có được khoảng cách chính xác 2, 4v.v. chúng tôi muốn, nhưng thông qua việc lặp lại, chúng sẽ đủ gần với các giá trị khoảng cách mong muốn để bạn có thể ánh xạ tới các tbước của mình với độ chính xác hợp lý, loại bỏ sai lệch do để lấy mẫu gần bằng nhau.

Sau đó, bạn có thể truy xuất t=0.5, ví dụ như Ivo thực hiện trong câu trả lời của mình, tức là bằng cách nội suy giữa hai giá trị gần nhất ở trên ( 3.99981326.00703).

Phần kết luận

Trong hầu hết các trường hợp, giải pháp của Ivo sẽ hoạt động tốt, nhưng đối với các trường hợp phải tránh sự thiên vị bằng mọi giá, hãy chắc chắn rằng các distances của bạn được phân tán đều nhất có thể, và sau đó được ánh xạ tuyến tính t.

Lưu ý rằng việc chia tách có thể được thực hiện một cách ngẫu nhiên thay vì tách ra giữa mỗi lần, ví dụ chúng ta có thể đã chia khoảng thời gian ví dụ đầu tiên đó t=0.827thay vì tại t=0.9.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.