\n <\/td>\n | //@author<\/span> Joseph Catrambone<\/span><\/td>\n <\/tr>\n \n <\/td>\n | // See https://www.josephcatrambone.com/?p=967 for the original blog post and the derivation of all formulas.<\/span><\/td>\n <\/tr>\n \n <\/td>\n | \n<\/td>\n <\/tr>\n | \n <\/td>\n | class<\/span> Point<\/span> {<\/span><\/td>\n <\/tr>\n \n <\/td>\n | constructor<\/span>(<\/span>x<\/span>,<\/span> y<\/span>,<\/span> z<\/span>)<\/span> {<\/span><\/td>\n <\/tr>\n \n <\/td>\n | this<\/span>.<\/span>x<\/span> =<\/span> x<\/span>;<\/span><\/td>\n <\/tr>\n \n <\/td>\n | this<\/span>.<\/span>y<\/span> =<\/span> y<\/span>;<\/span><\/td>\n <\/tr>\n \n <\/td>\n | this<\/span>.<\/span>z<\/span> =<\/span> z<\/span>;<\/span><\/td>\n <\/tr>\n \n <\/td>\n | }<\/span><\/td>\n <\/tr>\n \n <\/td>\n | dot<\/span>(<\/span>other<\/span>)<\/span> {<\/span><\/td>\n <\/tr>\n \n <\/td>\n | return<\/span> this<\/span>.<\/span>x<\/span>*<\/span>other<\/span>.<\/span>x<\/span> +<\/span> this<\/span>.<\/span>y<\/span>*<\/span>other<\/span>.<\/span>y<\/span> +<\/span> this<\/span>.<\/span>z<\/span>*<\/span>other<\/span>.<\/span>z<\/span>;<\/span><\/td>\n <\/tr>\n \n <\/td>\n | }<\/span><\/td>\n <\/tr>\n \n <\/td>\n | cross<\/span>(<\/span>other<\/span>)<\/span> {<\/span><\/td>\n <\/tr>\n \n <\/td>\n | return<\/span> new<\/span> Point<\/span>(<\/span><\/td>\n <\/tr>\n \n <\/td>\n | this<\/span>.<\/span>y<\/span>*<\/span>other<\/span>.<\/span>z<\/span> -<\/span> this<\/span>.<\/span>z<\/span>*<\/span>other<\/span>.<\/span>y<\/span>,<\/span><\/td>\n <\/tr>\n \n <\/td>\n | this<\/span>.<\/span>x<\/span>*<\/span>other<\/span>.<\/span>z<\/span> -<\/span> this<\/span>.<\/span>z<\/span>*<\/span>other<\/span>.<\/span>x<\/span>,<\/span><\/td>\n <\/tr>\n \n <\/td>\n | this<\/span>.<\/span>x<\/span>*<\/span>other<\/span>.<\/span>y<\/span> -<\/span> this<\/span>.<\/span>y<\/span>*<\/span>other<\/span>.<\/span>x<\/span><\/td>\n <\/tr>\n \n <\/td>\n | )<\/span>;<\/span><\/td>\n <\/tr>\n \n <\/td>\n | }<\/span><\/td>\n <\/tr>\n \n <\/td>\n | add<\/span>(<\/span>v<\/span>)<\/span> {<\/span><\/td>\n <\/tr>\n \n <\/td>\n | if<\/span>(<\/span>v<\/span> instanceof<\/span> Point<\/span>)<\/span> {<\/span><\/td>\n <\/tr>\n \n <\/td>\n | return<\/span> new<\/span> Point<\/span>(<\/span>this<\/span>.<\/span>x<\/span>+<\/span>v<\/span>.<\/span>x<\/span>,<\/span> this<\/span>.<\/span>y<\/span>+<\/span>v<\/span>.<\/span>y<\/span>,<\/span> this<\/span>.<\/span>z<\/span>+<\/span>v<\/span>.<\/span>z<\/span>)<\/span>;<\/span><\/td>\n <\/tr>\n \n <\/td>\n | }<\/span> else<\/span> {<\/span><\/td>\n <\/tr>\n \n <\/td>\n | return<\/span> new<\/span> Point<\/span>(<\/span>this<\/span>.<\/span>x<\/span>+<\/span>v<\/span>,<\/span> this<\/span>.<\/span>y<\/span>+<\/span>v<\/span>,<\/span> this<\/span>.<\/span>z<\/span>+<\/span>v<\/span> | | | | | | | | | | | | | | | | | | | | | | |