function doSth(){
var a = document.getElementById('input').value;
document.getElementById('number').innerHTML = toNumber(a) + 1;
}
function toNumber(str){
return +str;
}
<input id="input" type="text">
<input onclick="doSth()" type="submit">
<span id="number"></span>
Это отличный учебник по проблемам N-тела в целом.
http://www.artcompsci.org/#msa
Он написан с использованием Ruby, но довольно прост в отображении на другие языки и т. Д. Он охватывает некоторые из общих подходов интеграции; Форвард-Эйлер, чехарда и эрмит.
Все, что вам нужно реализовать, - это правильное дифференциальное уравнение (закон Кеплера) и использование Рунге-Кутты. (по крайней мере, это сработало для меня, но, возможно, есть лучшие методы)
Есть множество таких симуляторов онлайн.
Вот один простой пример, реализованный в 500 строках кода. (Монитор algorhitm намного меньше) http://astro.berkeley.edu/~dperley/programs/ssms.html .
Также проверьте это:
http://en.wikipedia.org/wiki/Kepler_problem
http://en.wikipedia.org / wiki / Two-body_problem
http://en.wikipedia.org/wiki/N-body_problem
Ознакомьтесь с nMod , инструментарием моделирования n-body, написанным на C ++ и использующим OpenGL. Он имеет довольно густонаселенную модель солнечной системы, которая поставляется с ним, и ее должно быть легко изменить. Кроме того, у него есть довольно хорошая вики о симуляции n-тела в целом. Тот же самый парень, который создал это, также делает новую программу под названием Moody , но, похоже, это не так уж далеко.
Кроме того, если вы собираетесь проводить симуляции n-тел с несколькими объектами, вам стоит обратить внимание на метод быстрого мультиполя (также называемый алгоритмом быстрого мультиполя). Это может уменьшить количество вычислений от O (N ^ 2) до O (N), чтобы действительно ускорить ваше моделирование. Это также один из десяти самых успешных алгоритмов 20-го века , согласно автору этой статьи.
Похоже, что это очень сложно и требует глубоких знаний физики, но на самом деле это очень просто, вам нужно знать только 2 формулы и базовое понимание векторов:
Сила притяжения (или гравитационная сила) между планетой 1 и планетой 2 с массой m1 и m2 и расстоянием между ними d: Fg = G * m1 * m2 / d ^ 2; Fg = m * a. G - это константа, найдите ее, подставив случайные значения, чтобы ускорение «а» не было слишком маленьким и не слишком большим, приблизительно «0,01» или «0,1».
Если у вас есть общая векторная сила, которая действует на текущую планету в этот момент времени, вы можете найти мгновенное ускорение a = (общая сила) / (масса текущей планеты). А если у вас есть текущее ускорение, текущая скорость и текущая позиция, вы можете найти новую скорость и новую позицию
Если вы хотите выглядеть реально, вы можете использовать следующий сверхлегкий алгоритм (псевдокод):
int n; // # of planets
Vector2D planetPosition[n];
Vector2D planetVelocity[n]; // initially set by (0, 0)
double planetMass[n];
while (true){
for (int i = 0; i < n; i++){
Vector2D totalForce = (0, 0); // acting on planet i
for (int j = 0; j < n; j++){
if (j == i)
continue; // force between some planet and itself is 0
Fg = G * planetMass[i] * planetMass[j] / distance(i, j) ^ 2;
// Fg is a scalar value representing magnitude of force acting
// between planet[i] and planet[j]
// vectorFg is a vector form of force Fg
// (planetPosition[j] - planetPosition[i]) is a vector value
// (planetPosition[j]-planetPosition[i])/(planetPosition[j]-plantetPosition[i]).magnitude() is a
// unit vector with direction from planet[i] to planet[j]
vectorFg = Fg * (planetPosition[j] - planetPosition[i]) /
(planetPosition[j] - planetPosition[i]).magnitude();
totalForce += vectorFg;
}
Vector2D acceleration = totalForce / planetMass[i];
planetVelocity[i] += acceleration;
}
// it is important to separate two for's, if you want to know why ask in the comments
for (int i = 0; i < n; i++)
planetPosition[i] += planetVelocity[i];
sleep 17 ms;
draw planets;
}
Вот вам:
How to: Reference ASP.NET Master Page Content
Из статьи, похоже, что
If Master.SQLerror = Nothing Then
InternalSQLErrLabel.Text = ("No Errors Reported")
End If
должен работать на вас.
Просто добавьте директиву MasterType, как описано выше, или вы можете получить ошибку преобразования типа. (Или вы могли бы использовать переменную вашего типа мастер-страницы вместо Master, как предлагает daRoBBie в своем ответе.)
Я создал тестовый веб-сайт только для того, чтобы проверить это, и это работает. Вот полный источник сайта :
Site1.Master :
<%@ Master Language="VB" AutoEventWireup="false" CodeBehind="Site1.master.vb" Inherits="WebApplication1.Site1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
This is the Master Page content.
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
</form>
</body>
</html>
Site1.Master.vb :
Public Partial Class Site1
Inherits System.Web.UI.MasterPage
Private _SQLerror As String
Public Property SQLerror() As String
Get
Return _SQLerror
End Get
Set(ByVal value As String)
_SQLerror = String.Empty
End Set
End Property
End Class
WebForm1.aspx :
<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site1.Master"
CodeBehind="WebForm1.aspx.vb" Inherits="WebApplication1.WebForm1" %>
<%@ MasterType VirtualPath="~/Site1.Master" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
This is the Content Page content.
<asp:Label ID="InternalSQLErrLabel" runat="server" Text="Label"></asp:Label>
</asp:Content>
WebForm1.aspx.vb :
Public Partial Class WebForm1
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Master.SQLerror = Nothing Then
InternalSQLErrLabel.Text = ("No Errors Reported")
End If
End Sub
End Class
-121--643148- используйте оператор кавычек Oracle:
select q'#someone's quote#' from dual;
символ «#» может быть заменен любым символом
-121--4907830-Вам нужно знать и понимать Закон всеобщего тяготения Ньютона и Законы планетарного движения Кеплера . Эти двое просты, и я уверен, что вы слышали о них, если не изучали их в средней школе. Наконец, если вы хотите, чтобы ваш симулятор был максимально точным, вам следует ознакомиться с проблемой n-Body .
Начните просто. Попробуйте создать объект Sun
и объект Earth
, который вращается вокруг него. Это должно дать вам очень солидное начало, и его довольно легко расширить оттуда. Объект планеты будет выглядеть примерно так:
Class Planet {
float x;
float y;
float z; // If you want to work in 3D
double velocity;
int mass;
}
Просто помните, что F = MA
, а остальные просто скучная математика: P
Вы можете взглянуть на Celestia , бесплатный космический симулятор. Я верю, что вы можете использовать его для создания фиктивных солнечных систем, и это открытый источник .
Если вы моделируете физику, я настоятельно рекомендую Box2D .
Это отличный симулятор физики, который действительно сократит количество необходимого вам котла за счет моделирования физики.
Fundamentals of Astrodynamics by Bate, Muller, and White все еще является обязательным чтением в моей альма-матер для инженеров аэрокосмической отрасли. Это, как правило, охватывает орбитальную механику тел на околоземной орбите ... но это, вероятно, уровень физики и математики, который вам понадобится, чтобы начать свое понимание.
+1 за предложение @Stefano Borini "все, что написал Жан Миус"
.