Mostrando entradas con la etiqueta Simulación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Simulación. Mostrar todas las entradas

Simulación del movimiento de los electrones en un campo electrico


Espectacular simulación realizada con OpenGL del movimiento de los electrones cuando atraviesan un campo eléctrico.

Como muestra la imagen se ven los electrones saliendo en tiempo real de la placa de color gris hacia la placa de color rojo acelerándose cuando atraviesan el campo eléctrico.

El escenario se puede girar o rotar en todas direcciones para apreciar mejor el movimiento.


Autor:
Email: systemhalt@nm.ru
www.systemhalt.nm.ru


Codigo fuente



Programas Delphi que utilizan OPENGL






1) Generador de curvas de Bezier



Esta aplicación genera un array de vértices utilizados para construir curvas de Bezier. Requiere que la tarjeta gráfica sea compatible con OpenGL.



Codigo fuente y programa








2) Utilización de una Webcam






Utilizando las primitivas OpenGL, permite ver la imagen de una webcam en una rejilla tridimensional, con la posibilidad de cambiar el ángulo de la cámara, la distancia del observador y la rotación de la imagen.











3) Bandera















4) Simulación del movimiento de los electrones































Simulador de circuitos lógicos



Simulador de circuitos con código fuente que permite diseñar circuitos basándose en puertas lógicas: Y, AND, OR, etc.



Una vez que se termina el diseño se puede activar virtualmente para ver su resultado.
Utilizando o no una tabla es posible realizar funciones básicas: sumador, comparador, etc y simular cualquier expresión booleana de una forma fácil.
El autor incluye varios ejemplos:
-Un display de 7 segmentos
-Un multiplicador binario.

Descargar codigo

Autor: Montero-Ribas

Web: ADMR.CAD.Free.fr





Movimiento de un octoedro



Movimiento de un octaedro en pantalla. (No utiliza OpenGL, GlScene)





Codigo fuente










LIBROS:














Rotación de poliedros en el espacio








Simula el movimiento de un objeto sobre los 3 ejes X,Y,Z





Gravedad pixelada


Simulación del movimiento de miles de píxeles bajo la influencia de las reglas de la gravedad.





















Autor: Gerben Wijnja





Seguimiento de personas, animales y objetos con OpenCV en Delphi




OpenCV para los que no la conozcan, es una biblioteca libre enfocada hacia la visión artificial, inicialmente desarrollada por Intel bajo licencia BSD lo que permite que sea usada libremente para un propósito comercial o de investigación.






OpenCV es multiplataforma con versiones para Windows, Linux y Mac y contiene funciones que tratan los temas de proceso de visión, reconocimiento facial, calibrado de cámaras o robótica.


Esta biblioteca es la base de la herramienta Swistrack que sirve para hacer un seguimiento de personas, animales y objetos.





El siguiente código se puede ejecutar en Delphi XE2 o superior y lo que hace es, como veis en la imagen, un seguimiento de las personas que circulan por la calle rodeándolas con un rectángulo de color rojo a medida que se van desplazando.




(* /*****************************************************************
// Delphi-OpenCV Demo
// Copyright (C) 2013 Project Delphi-OpenCV
// ****************************************************************
// Contributor:
// Mikhail Grigorev
// email: sleuthhound@gmail.com
// ****************************************************************
// You may retrieve the latest version of this file at the GitHub,
// located at git://github.com/Laex/Delphi-OpenCV.git
// ****************************************************************
// The contents of this file are used with permission, subject to
// the Mozilla Public License Version 1.1 (the "License"); you may
// not use this file except in compliance with the License. You may
// obtain a copy of the License at
// http://www.mozilla.org/MPL/MPL-1_1Final.html
//
// Software distributed under the License is distributed on an
// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
// implied. See the License for the specific language governing
// rights and limitations under the License.
******************************************************************* *)

// JCL_DEBUG_EXPERT_GENERATEJDBG OFF
// JCL_DEBUG_EXPERT_INSERTJDBG OFF
// JCL_DEBUG_EXPERT_DELETEMAPFILE OFF
program MotionDetect;

{$APPTYPE CONSOLE}
{$POINTERMATH ON}
{$R *.res}

uses
System.SysUtils,
Math,
uLibName in '..\..\..\include\uLibName.pas',
highgui_c in '..\..\..\include\highgui\highgui_c.pas',
imgproc.types_c in '..\..\..\include\imgproc\imgproc.types_c.pas',
imgproc_c in '..\..\..\include\imgproc\imgproc_c.pas',
imgproc in '..\..\..\include\imgproc\imgproc.pas',
core in '..\..\..\include\core\core.pas',
core.types_c in '..\..\..\include\core\Core.types_c.pas',
core_c in '..\..\..\include\core\core_c.pas';

var
storage: pCvMemStorage = nil;
capture: pCvCapture = nil;
frame: pIplImage = nil;
frame_grey: pIplImage = nil;
difference_img: pIplImage = nil;
oldframe_grey: pIplImage = nil;
contours: pCvSeq = nil;
c: pCvSeq = nil;
// rect: TCvRect;
rect2d: TCvBox2D;
key: integer;
first: boolean = true;

begin
try
capture := cvCreateCameraCapture(0);
storage := cvCreateMemStorage(0);
frame := cvQueryFrame(capture);
frame_grey := cvCreateImage(cvSize(frame^.width, frame^.height), IPL_DEPTH_8U, 1);

while true do
begin
frame := cvQueryFrame(capture);
if frame = nil then
break;
cvCvtColor(frame, frame_grey, CV_RGB2GRAY);
if first then
begin
difference_img := cvCloneImage(frame_grey);
oldframe_grey := cvCloneImage(frame_grey);
cvConvertScale(frame_grey, oldframe_grey, 1.0, 0.0);
first := false;
end;
cvAbsDiff(oldframe_grey, frame_grey, difference_img);
cvSmooth(difference_img, difference_img, CV_BLUR);
cvThreshold(difference_img, difference_img, 25, 255, CV_THRESH_BINARY);
contours := AllocMem(SizeOf(TCvSeq));
cvFindContours(difference_img, storage, @contours, SizeOf(TCvContour), CV_RETR_LIST, CV_CHAIN_APPROX_NONE,
cvPoint(0, 0));
c := contours;
while (c <> nil) do
begin
rect2d := cvMinAreaRect2(c);
cvRectangle(frame, cvPoint(Round(rect2d.center.x - rect2d.size.width / 2),
Round(rect2d.center.y - rect2d.size.height / 2)), cvPoint(Round(rect2d.center.x + rect2d.size.width / 2),
Round(rect2d.center.y + rect2d.size.height / 2)), cvScalar(0, 0, 255, 0), 2, 8, 0);
c := c.h_next;
end;
cvShowImage('Output Image', frame);
cvShowImage('Difference Image', difference_img);
cvConvertScale(frame_grey, oldframe_grey, 1.0, 0.0);
cvClearMemStorage(storage);
c := nil;
FreeMem(contours, SizeOf(TCvSeq));
key := cvWaitKey(33);
if (key = 27) then
break;
end;
cvReleaseMemStorage(storage);
cvReleaseCapture(capture);
cvReleaseImage(oldframe_grey);
cvReleaseImage(difference_img);
cvReleaseImage(frame_grey);
cvDestroyAllWindows();
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;

end.















Software para espeleología y topografía

GHTopo es un software libre (GPL) para la espeleología y topografía.


Está diseñado en torno al concepto Toporobot (un estándar en espeleología) y es compatible con él.


El software está desarrollado con Lázarus. Se requiere un paquete rxfpc.


Aparte de la naturaleza altamente especializada de GHTopo, uno puede encontrar módulos interesantes:


- Cálculo de matrices

- Conversor de las coordenadas geográficas

- Evaluador de expresiones

- Diagrama de viento Rose

- Uso Tachard

- Visualización OpenGL

- Exportación de software de mapas (Google Maps ...)


Código fuente

Simular un doble clic sobre la pantalla

Hace tiempo que quería obtener una función como la siguiente, sobre todo para conseguir
ahorrarme alguna acción repetitiva que tengo que realizar diariamente como informático.
Según Microsoft recomienda utilizar la función SendInput en vez de Mouse_Event, sin
embargo las pruebas que he realizado con SendInput no me han funcionado cuando se trata
de simular clics de ratón.

procedure TForm1.Button1Click(Sender: TObject);
var
P: TPoint;
begin
GetCursorPos(P); //almcacena la posición actual del cursor
SetCursorPos(Left + 10, Top + 10);
Mouse_Event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Mouse_Event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
GetDoubleClickTime;
Mouse_Event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Mouse_Event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
SetCursorPos(P.X, P.Y); //restaura el cursor a la posición original
end;

Rotar un punto en 3D

Rx,Ry,Rz =Ángulo X,Y,Z

X,Y,Z=posición inicial del punto

NX,NY,NZ=posición final del punto

const

PIDiv180 = 0.017453292519943295769236907684886;



procedure Rotate(Rx, Ry, Rz: Double; x, y, z: Double; var Nx, Ny, Nz: Double);

var

TempX: Double;

TempY: Double;

TempZ: Double;

SinX: Double;

SinY: Double;

SinZ: Double;

CosX: Double;

CosY: Double;

CosZ: Double;

XRadAng: Double;

YRadAng: Double;

ZRadAng: Double;

begin

XRadAng := Rx * PIDiv180;

YRadAng := Ry * PIDiv180;

ZRadAng := Rz * PIDiv180;



SinX := Sin(XRadAng);

SinY := Sin(YRadAng);

SinZ := Sin(ZRadAng);



CosX := Cos(XRadAng);

CosY := Cos(YRadAng);

CosZ := Cos(ZRadAng);



Tempy := y * CosY - z * SinY;

Tempz := y * SinY + z * CosY;

Tempx := x * CosX - Tempz * SinX;



Nz := x * SinX + Tempz * CosX;

Nx := Tempx * CosZ - TempY * SinZ;

Ny := Tempx * SinZ + TempY * CosZ;

end;

(* End Of *)




LIBROS:









Modelado 3D con Delphi




Para los entusiastas del modelado 3D aquí tienen un soft realizado en Delphi que permite construir piezas basándose en primitivas simples cilindros, cubos, etc y con las operaciones topológicas habituales como fusión, intersección, recorte, etc...


Permite hacer figuras de alambre, moverla y rotarla desde todos los ejes de coordenadas, hacer simulación del movimiento y pintar con colores cada cara del objeto.



Autor: Montero-Ribas

Licencia: GNU GPL



Descargar programa



Descargar codigo fuente






LIBROS:

Autocad 3D, DIBUJO Y MODELADO

3D con Photoshop

Aprender Maya, nivel avanzado, ejemplos y ejercicios

Aprender 3DS Max 2017 con 100 ejercicios prácticos

Programación en 3D con Java

Aprende Blender, diseño y creatividad











































Reproductor de estructuras moviles





Permite simular, dibujar y animar estructuras móviles y además puede servir de base para la construcción de vuestro propio motor de interacciones físicas.


Para empezar tenéis que ir al primer desplegable y seleccionar "construct", se limpiará la pantalla y haciendo clic sucesivamente iremos dibujando las partículas y sus uniones entre ellas.


Cuando terminemos de dibujar la figura en el primer desplegable hacemos clic sobre "simulate" para iniciar la animación y ver la interacción entre todos los elementos del gráfico.


Posteriormente se puede hacer clic mantenido sobre una partícula cualquiera para moverla.




Autor:


Paul TOTH

http://tothpaul.free.fr



Codigo fuente


























Delphi 3d engine













Os presento a continuación CAST II, un game engine open source gratuito para Delphi y Free Pascal.



Características:

Editor wysiwyg.



Compatibilidad - Bajos requerimientos de sistema, utilizando todo tipo de hardware.



Cross platform, multi API - en la versión actual utiliza DirectX 8.1 para hacer el render, pero el motor gráfico está preparado para utilizar también OpenGL o DX 9. 



Performance - El motor gráfico está diseñado para conseguir el máximo rendimiento.



Para hacer un juego con CAST II se tiene que escribir alguna clase que implemente la lógica del juego, crear artwork y construir niveles en el editor.



Incluye varios subsistemas:

-Editor de escenas

-Mensajería

-Rendering

-Audio

-Física (detector de colisiones y motor físico de terceras partes)

-Gestión de inputs

-Timer

-Gestión de red

-Gui



Tiene dos tipos de licencia:

Mozilla Public License  http://www.mozilla.org/MPL/MPL-1.1.html

o GNU Lesser General Public License 2.1  http://www.opensource.org/licenses/lgpl-license.php



Página del fabricante



Página de descarga del programa







EJEMPLOS



Vegetación
















Paisajes









Editor de partículas









Escena de un lago





 Editor CAST II

 






















Editor de paisajes

 





































































































Simular el movimiento de burbujas







Para los aficionados a la física aquí tienen una aplicación que simula muy realísticamente el movimiento de burbujas.



Para cambiar la velocidad de su movimiento sólamente hay que modificar la propiedad "interval" del componente Timer1.


Realizada por daniel.davies@blueyonder.co.uk







UNIT Unit1;

INTERFACE

USES
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

TYPE
TForm1 = CLASS(TForm)
Image1: TImage;
Timer1: TTimer;
PROCEDURE FormCreate(Sender: TObject);
PROCEDURE Timer1Timer(Sender: TObject);
PROCEDURE QuitClick(Sender: TObject);
PROCEDURE Image1Click(Sender: TObject);
PRIVATE
{ Private declarations }
PUBLIC
{ Public declarations }
END;

TYPE
co_ordinate = RECORD
x, y: integer;
END;

TYPE
scanline = ARRAY [0 .. 319] OF byte;

VAR
Form1: TForm1;
Threshold: integer;
blobimage: tbitmap;
blobs: ARRAY [0 .. 5] OF co_ordinate;
Frame: Cardinal;
drawing: boolean;

IMPLEMENTATION

{$R *.DFM}

PROCEDURE TForm1.FormCreate(Sender: TObject);
VAR
Temp: integer;
pal: PLogPalette;
hpal: HPALETTE;
BEGIN
Frame := 0;

blobimage := tbitmap.create;
blobimage.width := 320;
blobimage.height := 240;
blobimage.PixelFormat := pf8bit;
Image1.Picture.Bitmap := blobimage;

pal := NIL;
TRY
GetMem(pal, sizeof(TLogPalette) + sizeof(TPaletteEntry) * 255);
pal.palVersion := $300;
pal.palNumEntries := 256;
FOR Temp := 0 TO 255 DO
BEGIN
pal.palPalEntry[Temp].peRed := 255 - Temp; { (temp * 4)-1; }
pal.palPalEntry[Temp].peGreen := 0;
pal.palPalEntry[Temp].peBlue := 128 - Temp;
END;

hpal := CreatePalette(pal^);
IF hpal <> 0 THEN

Image1.Picture.Bitmap.Palette := hpal;
FINALLY
FreeMem(pal);
END;
application.ProcessMessages;
Timer1.Enabled := true;
END;

PROCEDURE TForm1.Timer1Timer(Sender: TObject);
VAR
X_Loop, Y_Loop, I: integer;
Value, t: integer;
Scan: ^scanline;
BEGIN
Frame := Frame + 1;
IF drawing = false THEN
BEGIN
blobs[0].x := 160 + round(150 * SIN((2 * Frame) * 0.01745329252222));
blobs[0].y := 100 + round(90 * SIN((4 * Frame) * 0.01745329252222));
blobs[1].x := 160 + round(150 * SIN((6 * Frame) * 0.01745329252222));
blobs[1].y := 100 + round(90 * SIN((3 * Frame) * 0.01745329252222));
blobs[2].x := 160 + round(150 * SIN((7 * Frame) * 0.01745329252222));
blobs[2].y := 100 + round(90 * SIN((5 * Frame) * 0.01745329252222));
blobs[3].x := 160 + round(150 * SIN((3 * Frame) * 0.01745329252222));
blobs[3].y := 100 + round(90 * SIN((2 * Frame) * 0.01745329252222));
blobs[4].x := 160 + round(150 * SIN((4 * Frame) * 0.01745329252222));
blobs[4].y := 100 + round(90 * SIN((2 * Frame) * 0.01745329252222));
blobs[5].x := 160 + round(150 * SIN((2 * Frame) * 0.01745329252222));
blobs[5].y := 100 + round(90 * SIN((3 * Frame) * 0.01745329252222));

drawing := true;
FOR Y_Loop := 0 TO 239 DO
BEGIN
Scan := Image1.Picture.Bitmap.scanline[Y_Loop];
FOR X_Loop := 0 TO 319 DO
BEGIN
t := 0;
FOR I := 0 TO 5 DO
BEGIN
Value := (blobs[I].x - X_Loop) * (blobs[I].x - X_Loop);
Value := Value + (blobs[I].y - Y_Loop) * (blobs[I].y - Y_Loop);
IF Value < 1 THEN
Value := 1;
t := t + (100000 DIV Value);
END;
t := 255 - t;
IF t < 0 THEN
t := 0;
Scan[X_Loop] := t;
{ if t >= 200 then scan[x_loop] := 0 else scan[x_loop] := 10; }

END;
END;

Image1.Refresh;
application.ProcessMessages;
drawing := false;
END;
END;

PROCEDURE TForm1.QuitClick(Sender: TObject);
BEGIN
Timer1.Enabled := false;
application.Terminate;
END;

PROCEDURE TForm1.Image1Click(Sender: TObject);
BEGIN
Timer1.Enabled := false;
application.Terminate;
END;

END.


Descargar aplicación





 

 

 

 

 

 

 

Simulación del movimiento de los electrones en un campo electrico

Espectacular simulación realizada con OpenGL del movimiento de los electrones cuando atraviesan un campo eléctrico. Como muestra la image...