473,657 Members | 2,604 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Need help designing a recursive function.

Hello I need some ideas for designing a recursive function for my ray
tracing program.

The idea behind ray tracing is to follow the electromagnetic rays from
the source, as they hit the object.The object is triangulated. The
rays can undergo multiple reflections, diffractions etc of the same
object i.e. a ray hits a surface of the object, undergoes reflection
resulting in a reflected ray which can again hit a surface, corner or
edge creating a reflected ray, diffracted ray etc .

Because multiple interactions with the object is possible, I want to
make the raytracing function recursive.Now, it is possible that the
program can get trapped in an infinite recursion due to rays
constantly bouncing of some triangular surface of the object and new
rays keep getting created. Hence, I use a counter called 'depth' in my
ray data structure. In my program, the maximum depth for a ray is 2.
eg. assume the ray coming from source has a depth of 0, and if the ray
hits an object, the reflected ray would have depth 1. If this
reflected ray hits another surface, once again a reflected ray is
created with depth 2. Child ray's depth = parent ray's depth + 1.

In my program, some calculations need to be performed. Like when a ray
hits some triangular surface, the incident electric field vector
because of this ray must be added to the total incident electric field
vector. Similarly, when the ray exits an object(does not intersect any
triangular surface on the object), we want to calculate some scattered
electric field vector and add it to the total scattered electric field
vector. Let's say if a ray has the maximum depth i.e. 2 and it still
intersects some triangular surface, then the recursion must stop. If
it doesn't intersect any traingular surface, calculate the scattered
field and return.

The data structure for ray :

typedef enum
{
PRIMARY_RAY,
REFLECTED_RAY,
EDGE_DIFFRACTED _RAY,
CORNER_DIFFRACT ED_RAY;

}raytype;

The ray type is used to distinguish between various types of rays i.e.
primary rays, reflected
rays, edge diffracted rays, corner diffracted rays.

typedef struct
{
int depth; /* the depth field as I explained */
vector origin; /* origin of ray */
vector direction; /* direction vector of ray */
vector efield; /* electric field at origin of ray */
double t; /* distance travelled */
raytype type; /* type of ray */

}ray;
I will post the skeleton of some functions I have written :

First, we want to create primary rays or rays originating from the
source having depth 0.

int calc_e_fields()
{
int i;
ray *r

for (i = 0; i < NUMBER_OF_RAYS; i++)
{
create_primary_ ray(&r)
raytrace(r);
free(r);
}
return 0;
}

With the above function, I create as many primary rays as specified by
user, and trace each
and every one of them(including their children rays). For all primary
rays, ray depth = 0 and raytype = PRIMARY_RAY
The ray trace function is recursive -

void raytrace(ray *r)
{
size_t index; /* Index of triangle intersected */
bool res = false; /* result of ray-surface intersection */
double u, v; /* barycentric coordinates used to calculate point of
intersection */

ray_kd_tree_int ersect(r, &index, &res, &u, &v);
/* Above function finds out if ray has intersected triangle, index
of the intersected
triangle, and the barycentric coordinates u and v */
if (r->depth == 2)
{
/* if ray's depth is 2, then check if it intersected any
triangular surface
if it intersected a triangular surface, then return because 2
is maximum depth.
If it did not intersect, then it exited the object so
calculate the scattered field */

if (!res)
{
calc_scattered_ field(r);
}
return;
}
else
{
/* ray depth is either 0 or 1 here */

if (res) /* ray intersected */
{
/* since ray intersected object calculate electric field
*/
calc_incident_f ield(r);
/* since ray intersected, a child ray should be created */
create_child_ra y(r, u, v);
}
else
{
/* ray did not intersect */

if (r->depth == 0)
{
/* if a ray direct from source did not intersect
object, no use of tracing it */
return;
}
else
{
/* if ray did not intersect object, then it has
exited the object*/
/* so calculate the scattered field and return*/
calc_scattered_ field(r);
return;
}
}
}
}
}
Now my problem is with the create_child_ra y(r, u, v) function.

The child ray can be a reflected ray, edge diffracted ray or a corner
diffracted ray.

Based on the value of barycentric coordinates of the point of
intersection i.e. u, v and a third coordinate w (which is 1-u-v , u,v
are always between 0 and 1), the child ray has to be calculated.

The child ray should be a edge diffracted ray if the parent ray had
hit an edge. This is indicated by exactly one of the barycentric
coordinates being 0(any one of u, v or w can be 0 but other 2 cannot
be zero).

The child ray should be a corner diffracted ray if the parent ray had
hit a corner. This is indicated by exactly one of the barycentric
coordinates being 1 and others being 0. 3 possible situations -

u v w
1 0 0
0 1 0
0 0 1

If neither of the above conditions are satisfied, then a reflected ray
must be created as the ray ha hit a point inside the triangle surface,
neither on the edge nor any of the 3 corners of triangle.
So I can write a function create_child_ra y which should call
approprate functions for creating the child rays.
void create_child_ra y(ray *r, double *u, double *v)
{
double w = 1 - *u - *v;

if ( (*u == 0 && *v == 0 && w == 1) ||
(*u == 0 && *v == 1 && w == 0) ||
(*u == 1 && *v == 0 && w == 0))
{
/* ray has hit a corner so create corner diffracted ray*/

create_corner_d iffracted_ray() ;
}
else
{
if ((*u == 0 && *v != 0 && w != 0) ||
(*u != 0 && *v == 0 && w != 0) ||
(*u != 0 && *v != 0 && w == 0))
{
/* ray hit an edge so create edge diffracted ray */

create_edge_dif fracted_ray();
}
else
{
create_reflecte d_ray();
}
}
}
Now my question is inside the create_reflecte d_ray or
create_edge_dif fracted_ray or create_corner_d iffracted_ray functions,
can I call the raytrace function ? since the child rays also need to
be traced recursively. eg:

void create_reflecte d_ray()
{
ray rr; /* reflected ray */

/* initialise reflected ray */

raytrace(&rr);
}

Also, when the ray undergoes reflection, only one child ray is
created(reflect ed ray) but when a ray undergoes diffraction, I need to
simulate the effect with many rays each travelling in different
directions. So in a way a parent ray gives rise to many child rays
each of which must be traced. So I want to write the
create_edge_dif fracted_ray or create_corner_d iffracted_ray as below :

void create_edge_dif fracted_ray()
{
ray edr;
int i;

for (i = 0; i < MAX_NUMBER_OF_D IFFRACTED_RAYS; i++)
{
/* initialise edr */
raytrace(&edr);
}
}

Is this permissible ??
Jul 24 '08 #1
9 2627

"pereges" <Br*****@gmail. comwrote in message
news:b0******** *************** ***********@h17 g2000prg.google groups.com...
[SNIP]

Now my question is inside the create_reflecte d_ray or
create_edge_dif fracted_ray or create_corner_d iffracted_ray functions,
can I call the raytrace function ? since the child rays also need to
be traced recursively. eg:
roughly speaking your question can be trimmed down to:

You have functions:
initiator()
sub1()
sub2()
sub3()

initiator() can call any of sub1(), sub2() or sub3() one or more times, and
it may call more than just one of the functions.
sub1(), sub2(), and sub3() may also call initiator() (directly or through
some other function that they call).

You are asking if this is possible in C? yes. It is dangerous because the
recursion isn't as obvious at first glance through the code.

The trick is - if you pass the same structure to multiple sub functions (or
the same one multiple times), when the depth argument goes up in one, it
goes up in all. If you send copies (and the original variable isn't
updated), then you are safe from this behavior.

Or am I completely off the ball? You may want to make a simpler case example
of your project.
-Jim Stapleton
Jul 24 '08 #2
On Jul 24, 8:23 pm, "S James S Stapleton" <stapleton...@o su.edu>
wrote:
roughly speaking your question can be trimmed down to:

You have functions:
initiator()
sub1()
sub2()
sub3()

initiator() can call any of sub1(), sub2() or sub3() one or more times, and
it may call more than just one of the functions.
sub1(), sub2(), and sub3() may also call initiator() (directly or through
some other function that they call).

You are asking if this is possible in C? yes. It is dangerous because the
recursion isn't as obvious at first glance through the code.

The trick is - if you pass the same structure to multiple sub functions (or
the same one multiple times), when the depth argument goes up in one, it
goes up in all. If you send copies (and the original variable isn't
updated), then you are safe from this behavior.

Or am I completely off the ball? You may want to make a simpler case example
of your project.

Ok roughly speaking this what the whole thing looks like -

void calc_e_field()
{
/* this function is initiator */
/* calling this function starts the who raytracing procedure for
each primary ray */
/* for each primary ray call raytrace function and trace all the
children ray */

....
for (...) /* Should run for all primary rays */
{
..
raytrace(&r);
...
}
....
}

void raytrace(ray *r)
{

/* this is where we trace a ray */
.....
.....
/* if certain conditions are satisfied we want to create a child
ray/rays
created by interaction of ray with surface */

create_child_ra y();
...
...
}

void create_child_ra y()
{
/* here we will call proper function based on the type of child ray
we want to generate */

/* the type of child ray to be generate depends on some conditions
*/

if (some condition 1)
create_reflecet d_ray();
if (some condition 2)
create_edge_dif fracted_ray();
if (some condition 3)
create_corner_d iffracted_ray() ;
}

This is what create_reflecte d_ray, create_edge_dif fracted_ray and
create_corner_d iffracted_ray look like -

void create_reflecte d_ray()
{
ray rr;
/* do some processing and create a reflected ray */

/* now, you want to trace this child ray too and see if it spawns
some more child ray(s) */

raytrace(&rr);
}

the edge_diffracted _ray and corner_diffract ed_ray are similar. They
differ from create_reflecte d_ray in the sense that we want to create
many child rays not just 1 as was the case in reflection. So inside a
for loop we initialise the ray, and then call the raytrace function.

Its like a ray tree.

eg.

(max ray depth = 2)

1. Suppose, primary ray hits the triangular surface (not corner or
edge) spawns a single reflected ray. Add the contribution of this ray
i.e. field at the point of reflection to total incident field.

2. Ray trace the reflected ray. Reflected ray has depth 1.

3. Suppose, reflected ray hits a corner . Add the contribution of
reflected ray i.e. field incident at the corner to total incident
field. Since a corner is hit, reflected ray spawns many diffracted
rays. Each diffracted ray has depth 2.

4. Ray trace each diffracted ray.

5. All those diffracted rays that exit object i.e. do not undergo
further intersection with object(surface, corner or edge), add their
respective contributions to scattered field. return.
For those rays that do intersect the object(which can give rise to
further child rays of depth 3), just don't do anything and return.

Jul 24 '08 #3

"pereges" <Br*****@gmail. comwrote in message
news:0d******** *************** ***********@w39 g2000prb.google groups.com...
>roughly speaking your question can be trimmed down to:

You have functions:
initiator()
sub1()
sub2()
sub3()

initiator() can call any of sub1(), sub2() or sub3() one or more times,
and
it may call more than just one of the functions.
sub1(), sub2(), and sub3() may also call initiator() (directly or through
some other function that they call).

You are asking if this is possible in C? yes. It is dangerous because the
recursion isn't as obvious at first glance through the code.

The trick is - if you pass the same structure to multiple sub functions
(or
the same one multiple times), when the depth argument goes up in one, it
goes up in all. If you send copies (and the original variable isn't
updated), then you are safe from this behavior.

Or am I completely off the ball? You may want to make a simpler case
example
of your project.


Ok roughly speaking this what the whole thing looks like -

void calc_e_field()
{
/* this function is initiator */
/* calling this function starts the who raytracing procedure for
each primary ray */
/* for each primary ray call raytrace function and trace all the
children ray */

....
for (...) /* Should run for all primary rays */
{
..
raytrace(&r);
...
}
....
}

void raytrace(ray *r)
{

/* this is where we trace a ray */
.....
.....
/* if certain conditions are satisfied we want to create a child
ray/rays
created by interaction of ray with surface */

create_child_ra y();
...
...
}

void create_child_ra y()
{
/* here we will call proper function based on the type of child ray
we want to generate */

/* the type of child ray to be generate depends on some conditions
*/

if (some condition 1)
create_reflecet d_ray();
if (some condition 2)
create_edge_dif fracted_ray();
if (some condition 3)
create_corner_d iffracted_ray() ;
}

This is what create_reflecte d_ray, create_edge_dif fracted_ray and
create_corner_d iffracted_ray look like -

void create_reflecte d_ray()
{
ray rr;
/* do some processing and create a reflected ray */

/* now, you want to trace this child ray too and see if it spawns
some more child ray(s) */

raytrace(&rr);
}

the edge_diffracted _ray and corner_diffract ed_ray are similar. They
differ from create_reflecte d_ray in the sense that we want to create
many child rays not just 1 as was the case in reflection. So inside a
for loop we initialise the ray, and then call the raytrace function.

Its like a ray tree.

eg.

(max ray depth = 2)

1. Suppose, primary ray hits the triangular surface (not corner or
edge) spawns a single reflected ray. Add the contribution of this ray
i.e. field at the point of reflection to total incident field.

2. Ray trace the reflected ray. Reflected ray has depth 1.

3. Suppose, reflected ray hits a corner . Add the contribution of
reflected ray i.e. field incident at the corner to total incident
field. Since a corner is hit, reflected ray spawns many diffracted
rays. Each diffracted ray has depth 2.

4. Ray trace each diffracted ray.

5. All those diffracted rays that exit object i.e. do not undergo
further intersection with object(surface, corner or edge), add their
respective contributions to scattered field. return.
For those rays that do intersect the object(which can give rise to
further child rays of depth 3), just don't do anything and return.
Unless I'm wrong, that's a simplification of what I described, tooled
towards raytracing. As I said, yes, that's permissable.

-Jim Stapleton
Jul 24 '08 #4
On Jul 24, 9:10 pm, "S James S Stapleton" <stapleton...@o su.edu>
wrote:
Unless I'm wrong, that's a simplification of what I described, tooled
towards raytracing. As I said, yes, that's permissable.
Then what were you trying to explain about ray depth ?

ray depth for all the primary rays created in calc_e_fields function
should be initialised to zero.

Then, for a child ray, depth = parent ray depth + 1.
Jul 24 '08 #5
I was wondering if I could solve it with better approach though. The
last time I executed the program(kept the number of rays very high),
the process got killed after some iterations. Don't know if it has
something to do with the memory usage or the nature of recursion. I've
heard recursion makes things slow.
Jul 24 '08 #6

"pereges" <Br*****@gmail. comwrote in message
news:2d******** *************** ***********@o40 g2000prn.google groups.com...
On Jul 24, 9:10 pm, "S James S Stapleton" <stapleton...@o su.edu>
wrote:
>Unless I'm wrong, that's a simplification of what I described, tooled
towards raytracing. As I said, yes, that's permissable.

Then what were you trying to explain about ray depth ?

ray depth for all the primary rays created in calc_e_fields function
should be initialised to zero.

Then, for a child ray, depth = parent ray depth + 1.
Are you talking about my reply that wasn't to the list? That's a different
matter entirely, and shouldn't be discussed on this list (very off topic).
It would go on a '3d' list. Mostly it was a set of ideas for adding
interesting effects.

Aside from the last couple sentences, everything I have said has
intentionally abstracted out the raytracing elements, making it generic. You
asked if your setup was possible in C, the subject indicated the question
was in regards to recursion. Basically, you have, lacking the theoretical
knowledge of what it is actually called, an indirect recursion. A direct
recursion would be where one function calls itself. An indirect recursion
would be where one function calls other function(s), which may in turn call
other function(s) creating a chain leading back to the first function being
called again. That is acceptable in C as far as I know. Although, if I
remember correctly, A stack overflow may occur if you recurse too deeply.
With a depth of 2 (4-6 function calls deep in your sample?) that's not
likely to happen.

-Jim Stapleton
Jul 24 '08 #7

"pereges" <Br*****@gmail. comwrote in message
news:1a******** *************** ***********@k36 g2000pri.google groups.com...
>I was wondering if I could solve it with better approach though. The
last time I executed the program(kept the number of rays very high),
the process got killed after some iterations. Don't know if it has
something to do with the memory usage or the nature of recursion. I've
heard recursion makes things slow.
THis is going more into comp.programmin g I think, but roughly speaking, you
need a simplified test case to find out why it's failing. There's a lot of
areas in that code where the potential for failure exists.

Can you simplify the test case - make it so you have only a small number of
rays, possibly only tracing the first ray in an image, and quit after that?
With that and a simple diagnostic function set (see the end of the file),
you can fairly easily figure out where things are going wrong most of the
time (if the problem is within your code).

If you use the code at the end of this message, and increase the RTDBG_DEPTH
when the recursion level goes up, decreasing it when it goes down, you
should get a fairly nice set of output, showing you where your program is
getting caught. You simply put the appropriate RTDBG() statement in various
places, showing variables or interest (or simply that you've reached that
point in code execution).

-Jim Stapleton


in a debug.h file (this code is close, I use something simpler since I'm not
dealing with recursion):

#ifdef DEBUG
extern int RTDBG_DEPTH; /*set to 0 in the C file that defines it*/
#include <stdio.h>
#include <malloc.h>
#define RTDBG(A) \
if(1) /*gives it a block, this should prevent the variables from
conflicting with more than one debug in a setup*/ \
{ \
fprintf(STDERR, "%04d>DEBUG : % 15s(%05d)" ## A, RTDBG_DEPTH, __file__,
__line__); \
}
/*code omitted for the following, it's fairly straightforward , just add the
letters shown to the end of the printf arg list*/
#define RTDBG1(A, B)
#define RTDBG2(A, B, C)
#define RTDBG3(A, B, C, D)
#define RTDBG4(A, B, C, D, E)
#define RTDBG5(A, B, C, D, E, F)
#else
#define RTDBG(A)
#define RTDBG1(A, B)
#define RTDBG2(A, B, C)
#define RTDBG3(A, B, C, D)
#define RTDBG4(A, B, C, D, E)
#define RTDBG5(A, B, C, D, E, F)
#endif
Jul 24 '08 #8

"pereges" <Br*****@gmail. comwrote in message
Hello I need some ideas for designing a recursive function for my ray
tracing program.

Now my question is inside the create_reflecte d_ray or
create_edge_dif fracted_ray or create_corner_d iffracted_ray functions,
can I call the raytrace function ? since the child rays also need to
be traced recursively. eg:
Yes, C functions can be mutually recursive.

However to keep the number of rays within bounds you need to trace
backwards, from the eye to the light.

So start by casting a ray from the user's eye, or camera, to the corner
pixel. The continue until you hit an object.

If that object is a light, then you've got your pixel colour.

If it is a black body, you've also got your pixel.

If it is reflective then cast rays from the point of intersection to all
your light sources in the scene, to determine the colour of light coming
into the surface at that point. Then use the reflectivity to calculate the
colour of the surface.

Then you've got recursion to worry about. You can go back as many steps as
you want. Note this is no longer photrealistic. To be photrealistic we'd
have to cast rays from the surface in every direction, which would take too
long. So we just cast rays directly to the lights.

If you have refraction or non-point lightsources, that adds another layer of
complexity. I'd get a raytracer with point lights and simple refective
surfaces working first.
--
Free games and programming goodies.
http://www.personal.leeds.ac.uk/~bgy1mm

Jul 24 '08 #9
>Hello I need some ideas for designing a recursive function for my ray
>tracing program.

The idea behind ray tracing is to follow the electromagnetic rays from
the source, as they hit the object.The object is triangulated. The
rays can undergo multiple reflections, diffractions etc of the same
object i.e. a ray hits a surface of the object, undergoes reflection
resulting in a reflected ray which can again hit a surface, corner or
edge creating a reflected ray, diffracted ray etc .
One approach I have used for problems similar to this, including
shortest-path or best-move calculations for games, is a queueing
setup to turn recursion into a loop.

1. Initially put some work to do (e.g. the initial rays) on the queue.
2. Loop over the process until you run out of work:
2a. Take an item off the queue.
2b. Process it (possibly involves saving the final state).
2c. If it generates any children, add them to the queue to be
done later. (depending on the situation, this may involve
removing duplicates).
3. You're done.

Some things that can be done with the queue include sorting it by
priority, so, for example, you do all the 0-depth rays done before
doing any 1-depth rays, or sort rays by intensity, and you might
at some point after a given amount of CPU decide that you have a
good enough approximation. Duplicate elimination may also help you
get out of loops.

Jul 24 '08 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
2881
by: | last post by:
OK: Purpose: Using user's input and 3 recursive functions, construct an hour glass figure. Main can only have user input, loops and function calls. Recursive function 1 takes input and displays a sequence of spaces; recursive function 2 uses input to display ascending sequence of digits; likewise, recursive function 3 uses input to display descending sequence of digits. I have not followed the instructions completely regarding the...
2
3876
by: Jackson Yap | last post by:
can someone kind enough to help me look at the attached html and js file? Why is it that the javascript menu could not work at www.apchosting.net but could work at http://home.pacific.net.sg/~jacksony ? (the drop down bar could not work at www.apchosting.net but can drop at home.pacific.net.sg. I suspect it is a server problem but was told it is not possible, therefore assuming it is a client script problem? the script works last time...
4
9047
by: Victor | last post by:
Hello, I've got a situation in which the number of (valid) recursive calls I make will cause stack overflow. I can use getrlimit (and setrlimit) to test (and set) my current stack size. However, it is not as straightforward to determine the base address for my stack space. The approach I have taken is to save the address of an automatic variable in main( ), and assume this is a fairly good indicator of my base address. Then, I can...
9
13194
by: Bill Borg | last post by:
Hello, I call a function recursively to find an item that exists *anywhere* down the chain. Let's say I find it five layers deep. Now I've got what I need and want to break out of that whole stack and continue execution at the point of the initial call. Is that possible? Thanks, Bill
0
1831
by: Michael L | last post by:
Hi Guys(I apologize for the lengty post - Im trying to explain it as best i can) I've been cracking my head on this one for the past 24+ hours and i have tried creating the function in ten different ways and none of the versions i've made works exactly as it should. I have an array called $PageArray which contains a sorted list of all pages in my application. Im trying to create a recursive function(It dosn't need to be recursive if...
2
1804
by: Anders B | last post by:
I want to make a program that reads the content of a LUA array save file.. More precicely a save file from a World of Warcraft plugin called CharacterProfiler, which dumps alot of information about your characters into that save file. Anyhow, I want to extract a couple of lines of it and save it into a database and I need help on figuring out a good way of reading the file. The problem is that the file can look pretty different depending...
6
1704
by: Designing Solutions WD | last post by:
I have the following table. GO /****** Object: Table . Script Date: 05/01/2007 10:42:31 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO
3
4224
by: from.future.import | last post by:
Hi, I encountered garbage collection behaviour that I didn't expect when using a recursive function inside another function: the definition of the inner function seems to contain a circular reference, which means it is only collected by the mark-and-sweep collector, not by reference counting. Here is some code that demonstrates it: === def outer():
0
8385
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
8303
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
8821
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
1
8502
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
8602
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
7316
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
1
6162
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
1
2726
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
1601
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.